【问题标题】:How does one design his various architecture/business models?一个人如何设计他的各种架构/业务模型?
【发布时间】:2014-05-21 20:11:50
【问题描述】:

我目前正在学习各种应用程序设计方法,但有一件事我无法真正理解。

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

public class IPCamera {

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

}

现在,如果我想将 IPCamera 存储到数据库中(例如,使用 Entity Framework),我可能需要其他/附加属性,因此需要另一个模型:

   public int         Id         { get; set; }

哦.. 我想通过 WCF 服务访问我的应用程序。我不能在这里使用对象“IPAddress”,因为它对序列化不太友好,因此我需要另一个具有自定义 IP 类的模型,该类将 IP 地址存储为字符串。

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

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

【问题讨论】:

    标签: c# design-patterns architecture domain-driven-design


    【解决方案1】:

    我会在您的实体中包含所有内容,然后创建仅公开对您访问实体的域重要的属性的视图模型。

    您的实体:

    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 实体的属性,然后将它们从另一个实体添加到您的视图模型中。

    【讨论】:

      【解决方案2】:

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

      您可以使用 AutoMapper 等工具轻松映射到视图模型/从视图模型映射。

      至于命名,我不会在 API 层使用技术后缀(如 *ViewModel)。认真思考并找出每个投影的正确域(面向业务)名称。像 IpCameraStatus 或者可能只是 IpCamera(但在另一个命名空间中)。

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2012-01-01
        • 1970-01-01
        • 2010-11-18
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        相关资源
        最近更新 更多