【问题标题】:What Should a domain Model return when using an interface? [closed]使用接口时域模型应该返回什么? [关闭]
【发布时间】:2016-07-04 12:47:48
【问题描述】:

我有一个 MVC 应用程序,其中域模型(数据模型 + 业务模型)驻留在不同的类库中。我使用的接口公开了一些必须返回数据但不一定是我的域对象的整个表示的方法。

我的问题是我应该如何返回数据?
我应该在业务模型层上创建一种视图模型,然后将它们与我在主应用程序上的真实视图模型(views-controllers-viewmodels)匹配吗?
我应该将此数据作为动态对象返回吗?
我应该返回整个域对象事件吗?我只需要几个属性吗?
最好的方法是什么?

这是一个更好地了解情况的示例:

//Domain Class
public class User
{
   public string UserName { get; set; }
   public int UserId { get; set; }
   public string UserPassword{ get; set; }
   public string FirstName{ get; set; }  
   public virtual ICollection<ApplicationUserTeam> ApplicationUserTeams
    {
        get { return _applicationUserTeams; }
        set { _applicationUserTeams = value; }
    }     

}


public interface ITrackAttendance
{
  dynamic GetUsersCompany(int CompanyId);

}

 public class TrackAttendanceServices : ITrackAttendance
{
    //Method returning a Dynamic Object???
    public dynamic GetUsersCompany(int CompanyId)
    {

        using (var _ctx = new TrackAttendanceDb())
        {
            return _ctx.Users.Where(u => u.ApplicationUserTeams.FirstOrDefault().Team.CompanyId== CompanyId)                    
                .Select(u =>
                         new
                          {
                            UserName = u.UserName,
                            UserId = u.Id,
                            userState = false

                         }).ToList();


        }

    }

}

项目架构:

我的解决方案:

感谢所有对此问题发表意见的专家,我决定基于以下几个方面采用 DTO 方法 (@uk2k05):

  • 它让我能够保持一个非常干净的架构。
  • 这种方式更符合单一职责原则
  • 它确保我的应用层不依赖于底层域模型。

我必须承认这里提出的其他有趣的方法,例如工厂模式 (@Liam) 和命令查询分离 (CQS)(@L-Four),它们都有助于解决问题,但它们可能会为我的特定环境增加额外的复杂性和工作。 CQS 和 FP 需要转变思维来定义架构(根据我的拙见和个人意见)。

【问题讨论】:

  • 为什么要返回域模型实体进行查询?为什么不将命令与查询分开,直接绕过领域层进行查询。
  • 对不起,我不是你的意思。你能更明确一点或者举个例子吗?谢谢。
  • 我认为Factory pattern 可以更好地解决您在这里尝试做的事情。你创建了一个工厂,你调用工厂返回一个对象。您在控制器中使用此对象(可能根据实现转换为 ViewModel)。那就是说你的问题很不清楚。例如,这其中的哪一部分应该是存储库模式?
  • 好吧,伙计们,我有点困惑,基本上我试图避免将我的对象暴露给应用程序层(不在此处创建对该库的引用),同时,不复制我的业务在域层中创建一种“视图模型”的对象(我猜这个 DTO 定义)在我看来有点多余。只想知道如何将部分实体返回给控制器(无需从控制器查询数据库)。
  • 感谢@Liam,使用工厂模式显然有很好的理由。但是,与 CQS 原则一样,我还看不到要应用的正确环境。由于我更新的问题中暴露的原因,我决定坚持使用 DTS 方法。 (PS:@Liam,可惜你删了你的第一个答案,真的很有用。)

标签: c# asp.net-mvc design-patterns model-view-controller repository-pattern


【解决方案1】:

看看命令-查询分离 (CQS)。基本上这意味着您将查询端与命令端分开。

对于命令,例如更新实体的创建,您可能会像现在一样遍历域模型。

但是,对于查询,无需通过域层,因为您不会以任何方式更改系统,而只是检索信息。因此,您可以简单地绕过领域层,直接查询数据库并返回(投影)数据实体;然后在您的控制器中将其映射到专用视图模型并传递给视图。 projected,我的意思是你不直接暴露你的数据层,而是基于它构建的 DTO;这可能看起来与您的域模型实体完全不同。

有很多关于它的信息,例如阅读here

【讨论】:

  • 但是,这意味着直接从控制器查询数据库?我为我的业务逻辑创建了一个类库,以便有一个处理数据库的层。
  • 不,您的命令端旁边会有一个查询端。查询端也可以是一个常规的类库,就像你的领域模型有一个类库一样。
  • 感谢@LFour。这种方法真的很有趣,我想更详细地探索它,以确定何时可以真正使用它。对于我的特定环境,为了简单起见,我决定采用 DTS 方法。
猜你喜欢
  • 2022-01-02
  • 2011-02-04
  • 1970-01-01
  • 2010-12-13
  • 2018-10-02
  • 2017-09-11
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多