Контракты и модели WCF в клиенте MVVM - PullRequest
1 голос
/ 14 декабря 2010

У меня есть служба WCF и клиентское приложение WPF, созданное с использованием шаблона MVVM. Указанная служба WCF позволяет клиенту WPF манипулировать контрактами, в которых описываются данные, которые можно отправлять и получать от службы.

Типовой договор, определенный Служебная сторона:

[DataContract()]
public class UserContract : BaseContract
{
    [DataMember()]
    public string UserName { get; set; }
    [DataMember()]
    public string FirstName { get; set; }
}

Если я рассматриваю эти ссылочные контракты как часть уровня модели моего приложения MVVM, какова должна быть связь между этими контрактами и классами моделей моего уровня модели? (Примеры кода на стороне клиента)

1. Наследование? Модели наследуют контракты.

public class UserModel : UserContract

2. Композиция? Модели содержат экземпляр соответствующего договора.

public class UserModel
{
  public UserContract userContract {get;set;}
}

3. Добавление? Контракты объявляются частичными, я могу просто "завершить" контракты и использовать их напрямую в качестве моих классов моделей.

public partial class UserContract
{
}

1 Ответ

4 голосов
/ 14 декабря 2010

Я рекомендую вам хранить Model Layer отдельно от Contract Layer. Я считаю, что контракты должны действовать как DTOs или Messages между приложением и службой, и все.

- EDIT -

  • Model Layer/Business Layer: состоит из Business Logic и Business Rules.

  • Contract Layer: состоит из Models и другой информации, необходимой для правильной отправки / получения данных.

Пример:

[В этом примере используется шаблон Запрос / Ответ.]

Модель:

public class User
{
    public String Username { get; set; }
    public String Password { get; set; }
}

Контракты:

public class GetUsersRequest
{ }

public class GetUsersResponse
{
    public List<User> Users { get; set; }
    public Boolean IsSuccess { get; set; }
}

Услуги:

public interface IUserService
{
    GetUsersResponse GetUsers(GetUsersRequest request);
}

public class UserService : IUserService
{
    public GetUsersResponse GetUsers(GetUsersRequest request)
    {
        GetUsersResponse response = new GetUsersResponse();
        //...
        return response;
    }
}

Если вы видите здесь, Контракт GetUsersResponse состоит из List of Users. Используется для перевода Users с Service на Client.

С другой стороны, Model Layer ничего не знает о Contract Layer. Это важно. Business Entities не должен ничего знать о других слоях. В Business Layer всегда должны быть классы, которые заполняют эти сущности из Data Layer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...