ASP.NET Core和ViewModelFactory

时间:2017-02-11 04:33:52

标签: c# asp.net-core asp.net-core-mvc ioc-container

您好,我正在尝试实施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时,头痛会来,所以我想避免两件事:

  1. Bloat ctor with injection
  2. 带注册的Bloat容器
  3. 我希望能够在我的控制器上注入IViewModelFactory,然后像这样使用它:

    [HttpGet]
    public IActionResult GetUsers(int id)
    {
        return View(viewModelFactory.Build<GetUserViewModel>(id));
    }
    

    请注意,在调用Build(T)时,必须调用正确的IViewModelFactory实现。

    我知道StructureMap容器​​支持将具体实现绑定到相应的接口,但我试图提出一个解决方案,而不必为项目添加另一个依赖。

2 个答案:

答案 0 :(得分:1)

我认为如果你有构建视图模型的构建器,那么工厂是额外的抽象层,可以简单地删除。
因为您在编译时知道创建的viewmodel的类型,所以您只需向控制器构造函数注入所需的构建器。

如果您的控制器创建了大量的视图模型,并且您最终需要注入大量构建器 - 这可以被视为违反单一责任原则的标志。在这种情况下,您需要将控制器的逻辑分离到不同的控制器。

  

所以我想避免两件事:

     

注射臃肿

  • 将具有臃肿构造函数的类与具有更多特定责任的另一个类分开,这需要较少的依​​赖项。
  • 或者根据关系将一个或两个,三个类包含在依赖关系中
  

带注册的Bloat容器

  • 这不是问题,因为依赖容器通常用于注册整个&#34;对象图&#34;你的申请

答案 1 :(得分:0)

经过一段时间的研究,我终于找到了解决这个问题的好方法。

该解决方案基本上是通过IServiceCollection.ConnectImplementations()扩展方法扩展默认IoC功能。

在注册过程中,我会搜索我的具体类,并将它们与各自的接口(如其他容器)连接起来。然后我使用注入了IServiceCollection的Mediator / Proxy,知道哪个具体类应该构建视图模型。

我已经创建了this gist更好地解释了完整的解决方案。