C# 当使用接口时,域模型应该返回什么?

C# 当使用接口时,域模型应该返回什么?,c#,asp.net-mvc,design-patterns,model-view-controller,repository-pattern,C#,Asp.net Mvc,Design Patterns,Model View Controller,Repository Pattern,我有一个MVC应用程序,其中域模型(数据模型+业务模型)位于不同的类库中。我使用的接口公开了一些方法,这些方法必须返回数据,但不一定是我的域对象的整个表示 我的问题是如何返回数据? 我是否应该在业务模型层上创建一种视图模型,然后将其与主应用程序上的真实视图模型相匹配(views controllers-viewmodels)? 是否应将此数据作为动态对象返回? 我是否应该返回整个域对象事件?我只需要几个属性? 最好的方法是什么 这是一个更好地了解情况的示例: //Domain Class pub

我有一个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();


        }

    }

}
//域类
公共类用户
{
公共字符串用户名{get;set;}
public int UserId{get;set;}
公共字符串UserPassword{get;set;}
公共字符串名{get;set;}
公共虚拟ICollection

我的解决方案:

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

  • 它允许我保持一个非常干净的架构
  • 这种做法更符合单一责任原则
  • 它确保我的应用程序层不依赖于底层域模型

我必须承认这里提出的其他有趣的方法,例如工厂模式(@Liam)和命令查询分离(CQS)(@L-Four),它们都有助于解决这个问题,但它们可能会增加额外的复杂性,并在我的特定环境中发挥作用。CQS和FP需要在定义体系结构时进行思维转换(以我个人的拙见)。

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

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

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


可以找到很多关于它的信息,例如read.

为什么要返回域模型实体进行查询?为什么不将命令与查询分开,直接绕过域层进行查询。对不起,我不明白你的意思。你能说得更清楚一点或者举个例子吗?谢谢。我想你想做什么a可以更好地解决此问题。创建工厂后,调用工厂返回对象。在控制器中使用此对象(可能会转换为ViewModel,具体取决于实现)。也就是说,你的问题非常不清楚。例如,这其中的哪一部分应该是存储库模式?伙计们,我有点困惑,基本上我是在试图避免将我的对象暴露到应用程序层(而不是在这里创建对该库的引用),同时,不复制我的业务对象创建一种域层中的“视图模型”(我猜这个DTOs定义)在我看来有点多余。只想知道如何将部分实体返回到控制器(而不从控制器查询db).Thank@Liam,使用工厂模式显然有很好的理由。但是,与CQS原则一样,我还看不到合适的应用环境。我决定坚持DTS方法,因为我更新的问题中暴露的原因。(附言:@Liam,很遗憾你删除了你的第一个答案,它真的很有用。)但是,这意味着直接从控制器查询数据库?我为我的业务逻辑创建了一个类库,以便有一个处理数据库的层。不,在命令端旁边有一个查询端。查询端也可以是一个常规类库,就像为域模型创建类库一样。而ks@LFour。这种方法非常有趣,我想进一步探讨它,以确定何时可以真正使用它。对于我的特定环境,为了简单起见,我决定使用DTS方法。