首页 文章

ASP.NET Core 和 ViewModelFactory

提问于
浏览
1

您好,我正在尝试实现 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 回答

  • 1

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

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

    所以我想避免两件事:

    膨胀 ctor 与注射

    • 将具有膨胀构造函数的类与具有更具体责任的另一个类分开,这需要较少的依赖性。

    • 或者根据关系将依赖关系包含在一个或两个,三个类中

    膨胀容器与注册

    • 这不是问题,因为依赖容器通常用于注册应用程序的整个“对象图”
  • 0

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

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

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

    我创建的这个要点更好地解释了完整的解决方案。

相关问题