【发布时间】:2012-04-24 07:13:21
【问题描述】:
我想知道我的解决方案是否存在设计缺陷。这是我所拥有的:
-
Entities=> 纯 poco。参考:无。 -
Data=> 数据访问。参考:Entities. -
Service=> 业务逻辑。参考:Entities和Data- 经理类。
- 视图模型。
-
WebApp=> 用户界面。参考:Entities和Service
WebApp ASP.NET MVC 项目作为 UI,Entities 项目没有用于持有纯 POCO 的参考。 Data 用于访问数据库,Service 用于业务逻辑(我的 Manager 类所在的位置)。
基本上,我为每个实体定义了一个Manager 类。例如,我有一个与Recipient 实体列表相关的Message 实体。我有一个MessageManager 和RecipientManager 类,负责使用数据层和逻辑结果的CRUD 操作(例如public List<Message> GetAllMessagesWithPermissionForUser(User user, Permission permission))
对于我的 MVC 项目,我在服务层定义了一些 ViewModel 类来为我的视图生成特定的视频模型。由于视图模型使用管理器类,我在我的服务类中定义了它们。例如,我有一个 MessageOperationVM 视图模型,它有一个 PermittedBoxesToSend 属性。此属性使用我的 BoxManager 类来获取指定消息允许的所有框:
// Initialized by Catsle Windsor.
public BoxManager BoxManager {get; set;}
public List<Box> PermittedBoxesToSend
{
if(this._premittedBoxesToSend != null)
{
this._permittedBoxesToSend = BoxManager.GetPermittedBoxesToSend(this.Message);
}
}
-
我不确定在 Viewmodels 中使用管理器类是否是一个好的设计。尽管我已将它们定义为构造函数/属性设置器以填充 DI。我应该在我的控制器中填充我的视图模型的属性而不是定义属性并摆脱我的视图模型中的管理器类吗?
public ActionResult ShowNewMessageDialog() { var messageVM = new MessageOperationVM() { new Message() }; messageVM = this.BoxManager.GetPermittedBoxesToSend(); } 为每个实体使用管理器类似乎使维护变得困难。 (尽管它们都派生自
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);
}
【问题讨论】:
-
服务中的业务逻辑敲响警钟:业务逻辑应该在实体中。
标签: design-patterns domain-driven-design viewmodel