依赖关系注入模型

Dav*_*vid 4 asp.net-mvc dependency-injection ninject repository-design custom-model-binder

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

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

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

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

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

一点背景:我是一位经验丰富的ASP.net开发人员,但对MVC来说是新手.

Rem*_*oor 8

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


Jur*_*uri 5

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

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

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

public class MyController : Controller
{
    private IPersonRepository personRepo;

    public MyController(IPersonRepository personRepo)
    { 
        this.personRepo = personRepo;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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