您好,我正在尝试实施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容器支持将具体实现绑定到相应的接口,但我试图提出一个解决方案,而不必为项目添加另一个依赖。
答案 0 :(得分:1)
我认为如果你有构建视图模型的构建器,那么工厂是额外的抽象层,可以简单地删除。
因为您在编译时知道创建的viewmodel的类型,所以您只需向控制器构造函数注入所需的构建器。
如果您的控制器创建了大量的视图模型,并且您最终需要注入大量构建器 - 这可以被视为违反单一责任原则的标志。在这种情况下,您需要将控制器的逻辑分离到不同的控制器。
所以我想避免两件事:
注射臃肿
带注册的Bloat容器
答案 1 :(得分:0)
经过一段时间的研究,我终于找到了解决这个问题的好方法。
该解决方案基本上是通过IServiceCollection.ConnectImplementations()
扩展方法扩展默认IoC功能。
在注册过程中,我会搜索我的具体类,并将它们与各自的接口(如其他容器)连接起来。然后我使用注入了IServiceCollection
的Mediator / Proxy,知道哪个具体类应该构建视图模型。
我已经创建了this gist更好地解释了完整的解决方案。