C# 如何设计各种架构/业务模型?

C# 如何设计各种架构/业务模型?,c#,design-patterns,architecture,domain-driven-design,C#,Design Patterns,Architecture,Domain Driven Design,我目前正在学习各种应用程序设计方法,有一件事我真的想不通 假设我的网络中有一个物理设备,一个IP监控摄像头。我需要一个代表“IP监控摄像头”的模型,以便在我的应用程序中使用它们,可能如下所示: public class IPCamera { public string Token { get; set; } public IPAddress IPAddress { get; set; } public string RtspUri {

我目前正在学习各种应用程序设计方法,有一件事我真的想不通

假设我的网络中有一个物理设备,一个IP监控摄像头。我需要一个代表“IP监控摄像头”的模型,以便在我的应用程序中使用它们,可能如下所示:

public class IPCamera {

    public string     Token      { get; set; }
    public IPAddress  IPAddress  { get; set; }
    public string     RtspUri    { get; set; }

}
现在,如果我想将IPCamera存储到数据库中(例如,使用实体框架),我可能需要其他/附加属性,因此需要另一个具有以下内容的模型:

   public int         Id         { get; set; }
哦。。我想通过WCF服务访问我的应用程序。我不能在这里使用对象“IPAddress”,因为它不是非常友好的序列化,因此我需要另一个带有自定义IP类的模型,该类将IP地址存储为字符串

最后,安卓客户端想要访问我的数据。我使用WebApi2设计了一个RESTful API。客户端对摄像头RTSPUri不感兴趣,但希望了解当前状态(在线、离线)


我想知道:如何命名所有这些模型,使它们不会产生冲突?我是否应该为每个目的/层/服务设计一个模型?以及如何链接/映射它们?使用适配器模式?

我将包括实体中的所有内容,然后创建视图模型,该模型仅公开对您访问实体所通过的域有影响的属性

您的实体:

public class IpCamera
{
    public int        Id         { get; set; }
    public string     Token      { get; set; }
    public IPAddress  IPAddress  { get; set; }
    public string     RtspUri    { get; set; }
    public bool       IsOnline   { get; set; }
}
在您的WCF服务中:

public class IpCameraViewModel
{
    public int        Id         { get; set; }
    public string     IpAddress  { get; set; }
    public string     Token      { get; set; }
    public string     RtspUri    { get; set; }
}
在api项目中:

public class IpCameraViewModel
{
    public int        Id         { get; set; }
    public string     IpAddress  { get; set; }
    public string     Token      { get; set; }
    public bool       IsOnline   { get; set; }
}

您只需将IpAddress设置为发送到接收客户端的字符串。你可以去掉任何你不想暴露的属性。或者,您可以添加不属于IpCamera实体的属性,只需将它们从另一个实体添加到视图模型中。

正如@Smith.h.Neil所建议的,您应该创建一个基本规范化模型(实体,如果愿意)来存储和多个视图模型(投影)

您可以使用AutoMapper之类的工具轻松地映射到视图模型或从视图模型映射到视图模型

至于命名,我不会在API层中使用技术后缀(比如*ViewModel)。仔细想想,找出每个投影的正确域名(面向业务)。就像IpCameraStatus或者仅仅是IpCamera(但在另一个名称空间中)