【发布时间】:2017-02-11 04:33:51
【问题描述】:
您好,我正在尝试实现 ViewModelFactory“模式”,考虑到当前 IoC 容器的限制,我想知道实现它的最佳方法是什么。
public class UserCreateViewModelFactory
{
private readonly DbContext db;
public UserCreateViewModelFactory(DbContext db){ this.db = db;}
public void Create(CreateUserViewModel viewModel)
{
//Creates the user
}
}
我将上述类轻松注入到我的控制器ctor中。当我需要更多 ViewModelBuilders 时,我会很头疼,所以我想避免两件事:
- 注射膨胀剂
- 带有注册的膨胀容器
我希望能够在我的控制器上注入 IViewModelFactory,然后像这样使用它:
[HttpGet]
public IActionResult GetUsers(int id)
{
return View(viewModelFactory.Build<GetUserViewModel>(id));
}
请注意,在调用 Build(T) 时,它必须调用正确的 IViewModelFactory 实现。
我知道 StructureMap 容器支持将具体实现绑定到相应的接口,但我正在尝试提出一个解决方案,而不必向项目添加另一个依赖项。
【问题讨论】:
-
您能解释一下为什么要抽象视图模型的创建吗?视图模型是 DTO;这是控制器通常应该自行更新的东西。通常没有理由抽象出 DTO 的创建。
-
想象一下你有复杂的视图模型。直接在控制器动作的主体中允许创建代码是很糟糕的。与您委派服务来执行复杂业务代码的原理相同。我在这里的目标是纤薄的控制器,所以一个动作应该做的很少,比如响应用户请求并返回其结果。
-
您的应用程序可能会受益于像this one 这样的设计。
-
@steven 我最近阅读了 Jim Bogart 的 Put your controllers on a diet 系列帖子。我已经非常喜欢 CQRS 模式。虽然这是一个很好的模式,但现在我正在通过服务分离我的业务逻辑。由于 aspnet 核心 IoC,我无法应用相同的调解器模式来解决工厂实现。我正在尝试在没有服务定位器反模式的情况下重现 this 的内容。
-
防止让您的容器强行限制您的设计。设计应该领先,您选择的框架和库应该遵循所选设计,而不是相反。
标签: c# asp.net-core asp.net-core-mvc ioc-container