5

我敢肯定之前有人问过这个问题,但我很难找到在哪里。

我正在使用 Ninject 从我的控制器中删除依赖项,以及存储库设计模式。

据我了解,这种方法的一个好处是我可以轻松地拆分我的存储库和域实体,并在我希望的情况下使用另一个程序集。因此,我将域实体和存储库保存在外部程序集中,并且可以从接口模拟我的所有依赖项。

似乎虽然我可以在大多数地方使用接口来引用我的域实体,但在涉及模型绑定时,我必须使用对具体类的引用。我读过这与我理解的序列化有关,但这是避免引用域实体来创建单独模型的唯一方法吗?

我可以用自定义模型绑定做什么?

一点背景知识:我是一位经验丰富的 ASP.net 开发人员,但对 MVC 很陌生。

4

3 回答 3

8

视图模型应该是没有逻辑的普通数据容器,因此根本不应该有任何依赖关系。而是将存储库注入您的控制器,并让它将存储库中的所需数据分配给视图模型的适当属性。

于 2011-11-08T11:11:44.200 回答
5

使用依赖注入框架的主要优点是IoC(控制反转):

  • 松耦合
  • 更灵活
  • 更容易测试

所以通常做的是通过他们的接口注入存储库,比如

public class MyController : Controller
{
    private IPersonRepository personRepo;

    public MyController(IPersonRepository personRepo)
    { 
        this.personRepo = personRepo;
    }
    ...
}

在测试期间,这允许轻松注入我的模拟存储库,该存储库准确返回我想要测试的那些值。

注入域实体没有多大意义,因为它们与特定类/控制器中的功能更紧密地联系在一起,因此进一步抽象它们只是一种开销,而不是一种好处。相反,如果您想将实际实体模型与控制器分离,您可以查看 MVVM 模式,创建专门的“视图模型”。

只需考虑控制器的可测试性:“我想模拟什么来对其进行单元测试?”

  • 数据库访问 -> 存储库
  • 外部依赖 -> 其他 BL 类、WS 调用等。

我不会在这里包含域实体,因为它们通常只是一个数据容器

于 2011-11-08T11:06:28.300 回答
1

更多细节会有所帮助。可能有点代码?

首先,您应该避免将依赖项注入域实体,而是使用域服务。

更多信息在这里

编辑 001:

我认为我们应该澄清我们的术语。域层包含所有域实体,例如产品、类别等。然后是数据层,其中包含为您的域实体提供水合物的存储库,然后是服务层,其中包含与数据层对话的应用程序服务。

最后,您有一个带有视图和控制器的表示层。控制器与应用服务层对话。因此,产品控制器与目录服务(例如 GetProductBySku)对话。CatalogueService 将有一个或多个存储库注入其构造函数(IProductRepository、ICategoryRepository 等)。在 asp.net mvc 中也很常见 ViewModel。将 ViewModel 放入您的应用程序服务层。

因此,当您说“模型”和“域实体”时,我不确定您的意思是什么,但我希望这能澄清术语。

于 2011-11-08T11:00:22.783 回答