【问题标题】:WCF Contracts and Models in a MVVM clientMVVM 客户端中的 WCF 合同和模型
【发布时间】:2010-12-14 16:50:44
【问题描述】:

我有一个使用 MVVM 模式构建的 WCF 服务和一个 WPF 客户端应用程序。引用的 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
{
}

【问题讨论】:

    标签: .net wpf wcf mvvm


    【解决方案1】:

    我建议您将Model LayerContract Layer 分开。我觉得应用程序和服务之间的合同应该像DTOsMessages 一样,就是这样。

    --编辑--

    • Model Layer/Business Layer:由Business LogicBusiness 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;
        }
    }
    

    如果您在此处看到,合同GetUsersResponseList of Users 组成。用于将UsersService转移到Client

    另一方面,Model LayerContract Layer 一无所知。这很重要。 Business Entities 应该对其他层一无所知。 Business Layer 中应该总是有类来填充来自 Data Layer 的这些实体。

    【讨论】:

    • @decyclone :您的意思是第四个选项:分离 - 合同用于建立接收模型,模型用于通过其他对象(存储库/工厂)建立发送合同,期间不保留链接其他任务?
    • @decyclone :考虑到您的编辑,您建议将模型层完全保留在服务端,为客户端“密封”?
    • 不,应该是服务和客户端共享的程序集。
    • @decyclone :哇,我不知道您可以在不使用 DataContract 的情况下引用数据。这种封装数据的方式有什么缺点吗?所有 wcf 示例 Ive seen so far were using DataContract to send their data. What happens if you reference models in models ? Or do you keep a "reference by Id" way for the model layer to have the models as light as possible ? Sorry if thats 有很多问题,但您的回答为我打开了很多有趣的新大门 :)
    • 嘿,我没有在请求/响应类中包含DataContract 标签。而且我也没有用ServiceContractOperationContract 标记IUserService。我希望您对此非常清楚,只是想讨论一下您对架构的疑问。
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多