您好,我正在尝试实现 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 时,头痛会来,所以我想避免两件事:
-
膨胀 ctor 与注射
-
膨胀容器与注册
我希望能够在我的控制器上注入IViewModelFactory
,然后像这样使用它:
[HttpGet]
public IActionResult GetUsers(int id)
{
return View(viewModelFactory.Build<GetUserViewModel>(id));
}
请注意,在调用Build(T)
时,它必须调用正确的IViewModelFactory
实现。
我知道 StructureMap 容器支持将具体实现绑定到相应的接口,但我试图提出一个解决方案,而不必为项目添加另一个依赖项。
2 回答
我认为如果你有构建视图模型的构建器,那么工厂是额外的抽象层,可以简单地删除。
因为您在编译时知道创建的 viewmodel 的类型,所以您只需向控制器构造函数注入所需的构建器。
如果您的控制器创建了大量的视图模型,并且您最终需要注入许多构建器 - 这可以被视为违反单一责任原则的标志。在这种情况下,您需要将控制器的逻辑分离到不同的控制器。
膨胀 ctor 与注射
将具有膨胀构造函数的类与具有更具体责任的另一个类分开,这需要较少的依赖性。
或者根据关系将依赖关系包含在一个或两个,三个类中
经过一段时间的研究,我终于找到了解决这个问题的好方法。
该解决方案基本上是通过
IServiceCollection.ConnectImplementations()
扩展方法扩展默认的 IoC 功能。在注册期间,我将搜索我的具体类并将它们与各自的接口(如其他容器)连接起来。然后我使用注入
IServiceCollection
并知道哪个具体类应该构建视图模型。我创建的这个要点更好地解释了完整的解决方案。