Kam*_*yar 4 design-patterns domain-driven-design viewmodel
我想知道我的解决方案是否存在设计缺陷.这就是我所拥有的:
Entities=>纯poco.refs:none.Data=>数据访问.refs : Entities.Service=>业务逻辑.refs:Entities和Data
WebApp=>用户界面.参考:Entities和ServiceWebAppASP.NET MVC项目作为UI,Entities项目没有参考,持有纯POCO.Data访问数据库和ServiceBusiness Logic(我的Manager类所在的位置).
基本上,我已经Manager为每个实体定义了一个类.例如,我有一个Message与Recipient实体列表有关的实体.我有一个MessageManager和RecipientManager类,负责使用数据层和逻辑结果的CRUD操作(例如public List<Message> GetAllMessagesWithPermissionForUser(User user, Permission permission))
对于我的MVC项目,我在Service层中定义了一些ViewModel类来为我的视图生成特定的视频模型.由于视图模型使用的是Manager类,因此我在我的服务类中定义了它们.例如,我有一个MessageOperationVM具有PermittedBoxesToSend属性的viewmodel .此属性使用我的BoxManager类获取指定消息允许的所有框:
// Initialized by Catsle Windsor.
public BoxManager BoxManager {get; set;}
public List<Box> PermittedBoxesToSend
{
if(this._premittedBoxesToSend != null)
{
this._permittedBoxesToSend = BoxManager.GetPermittedBoxesToSend(this.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定在Viewmodels中使用管理器类是否是一个好的设计.虽然我已经将它们定义为构造函数/属性setter以填充DI.我应该在控制器中填充我的viewmodels属性而不是定义属性并在我的ViewModels中删除管理器类吗?
public ActionResult ShowNewMessageDialog()
{
var messageVM = new MessageOperationVM() { new Message() };
messageVM = this.BoxManager.GetPermittedBoxesToSend();
}
Run Code Online (Sandbox Code Playgroud)为每个实体使用经理类似乎使维护变得困难.(虽然它们都来自一个BaseManager共享其共同操作的类)
谢谢.
更新:
基于eulerfx的回答:
我的回答是:要构建一个ViewModel,我必须调用一些服务层的方法.所以我不能仅仅根据我的poco实体构建我的ViewModel.你是否建议我也应该在控制器中构建这些部件?:
public ActionResult ShowNewMessageDialog()
{
var message = this.messageRepository.GetMessage();
var messageVM = new MessageViewModel(message);
messageVM.CustomProperty = this.messageManager.CallSomeMethod(message);
return View(messageVM);
}
Run Code Online (Sandbox Code Playgroud)
我会考虑视图模型的引用来为设计缺陷提供服务.视图模型应该是扁平的,简单的DTO用于与视图绑定.它们不应该是DI容器图的一部分,因为这会使事情复杂化并使代码的推理变得更加困难.您使用的术语的可接受定义如下.
代码看起来像这样:
/// Domain model class that lives in domain/business layer project
public class Message
{
// properties and behavior go here
}
// View model class that lives in the ASP.NET project
public class MessageViewModel
{
public MessageViewModel() { }
public MessageViewModel(Message message)
{
// construct the view model based on the provided entity
}
// properties specific to the view go here
}
// ASP.NET MVC controller.
public class MessagesController : Controller
{
// this repository should be injected by DI container.
readonly IMessageRepository messageRepository;
public ActionResult ShowNewMessageDialog()
{
var message = this.messageRepository.GetMessage();
return View(new MessageViewModel(message));
}
}
Run Code Online (Sandbox Code Playgroud)