我有一个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需要精神上的转变来定义架构(来自我的谦虚和个人观点)。
答案 0 :(得分:1)
查看命令查询分离(CQS)。基本上它意味着您从命令端拆分查询端。
对于命令,例如更新实体的创建,您可以像现在一样通过域模型。
但是,对于查询,不需要遍历域层,因为您不以任何方式更改系统,只需检索信息。因此,您可以简单地绕过域层,直接查询数据库并返回(投影)数据实体;然后在控制器中将其映射到专用视图模型并传递给视图。使用投影,我的意思是您不直接公开您的数据层,而是基于它构建的DTO;这可能看起来与您的域模型实体完全不同。
有很多关于它的信息,例如阅读here。