依赖关系注入模型

时间:2011-11-08 10:34:23

标签: asp.net-mvc dependency-injection ninject custom-model-binder repository-design

我确定之前有人问过这个,但我很难找到。

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

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

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

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

一些背景知识:我是一名经验丰富的ASP.net开发人员,但对MVC来说是新手。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

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

  • 松散耦合
  • 更多灵活性
  • 更轻松测试

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

public class MyController : Controller
{
    private IPersonRepository personRepo;

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

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

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

考虑一下你的控制器的可测试性:“我想要模拟出单元测试它?”

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

我不会在此处包含域名实体,因为它们通常只是数据容器

答案 2 :(得分:1)

更多细节会有所帮助。或许有点代码?

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

更多信息here

编辑001:

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

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

所以当你说“模特”和“领域实体”时,我不确定你的意思,但我希望这样清楚术语。