C#Dependency Injection与3个项目在同一个解决方案

时间:2016-12-26 18:20:50

标签: c# asp.net-mvc dependency-injection

我有一个单独项目的解决方案。结构是这样的: 1 - 网络项目 2 - Aplicacao,由1的控制器调用来执行逻辑 3 - Dominio,有我的解决方案的类 4 - Dados,它有实体框架的东西......

因此,当我有一个POST来注册一个新用户时,会调用UsuarioController(UC)。 UC必须通过usuario实现UsuarioAplicacao(UA)。 UA必须将usuarioRepositorio(UR)作为参数传递给usuarioRepositorio(UR),在这里它将被提供给数据库。

我习惯在类的构造函数中实现我需要的类,如下所示:

public ActionResult Registrar (Usuario usuario)
    {
        if (ModelState.IsValid)
        {
            var _usuarioApp = new UsuarioAplicacao();
            _usuarioApp.Salvar(usuario);
            rest of the code...
        }
    }

但是,在学习的同时,我已经知道这不太对。我应该使用依赖注入(DI)......

所以,使用DI和构造函数,我无法弄清楚如何做到这一点......

我在我的控制器中尝试过这样的事情:

private UsuarioAplicacao _usuarioAplicacao;

    public UsuarioController (UsuarioAplicacao usuarioAplicacao)
    {
        this._usuarioAplicacao = usuarioAplicacao;
    }

然后,在我的UsuarioAplicacao(执行逻辑的类并调用UsuarioRepositorio将对象保存到数据库中):

private readonly UsuarioRepositorio _usuarioRepositorio;
public UsuarioAplicacao (UsuarioRepositorio usuarioRepositorio)
{
    this._usuarioRepositorio = usuarioRepositorio;
}

和finnaly,在我的UsuarioRepositorio内部(负责通过实体框架将数据保存到数据库中的类):

private readonly Contexto _contexto;
public UsuarioRepositorio(Contexto contexto)
{
    this._contexto = contexto;
}

(_ contexto是我的EF上下文类)

这些是我的onstructors。但我得到空参考例外......

你们可以帮我依赖注射吗?

Ninject我无法理解如何使用......

提前致谢

1 个答案:

答案 0 :(得分:2)

您将获得空引用,因为您没有配置任何依赖项注入。简单地在控制器构造函数上传递参数是不够的,您必须实际告诉依赖注入器如何构造依赖项。

使用Unity,您可以在WebApiConfig上执行此类操作(如果在mvc上,则执行global.asax)

public static void UnityContext_OnRegisterComponents(Microsoft.Practices.Unity.UnityContainer container)
{
     container.RegisterType<ICarRepository, CarRepository>(new HierarchicalLifetimeManager());                
}

现在,对于依赖注入的概念,它用于保持项目之间的低耦合。您的控制器不能知道您的业务规则,也不知道如何创建属于另一个程序集的对象。

示例:当您创建存储库并直接在控制器上实例化您的实体时,您将在这些程序集之间创建依赖关系,这使得以后很难测试您的代码,也使其变得更加复杂。

在架构方面,我使用类似的东西:

网络 - 前端

业务 - 您的业务规则

合同 - 您声明数据传输对象的位置

数据 - 您声明实体的地方,实体框架执行低级别的操作,例如打开连接,将数据保存到数据库等,以及声明存储库的位置

在那个建筑中:

网络访问合同和业务

业务访问合同和数据

数据无法访问任何内容

业务将询问数据实体,数据将使用数据库中的实体模型进行回答,并且您需要执行的任何操作都将在业务中完成,返回数据传输对象(Contracts程序集),这将是它们可以在您的前端使用,无论是返回还是定义新模型以使传输对象适合您的前端。

在这种情况下,记住依赖注入,如果业务层知道如何创建数据层对象,它将创建一个耦合,所以不是这样做,而是配置一个依赖注入容器,该对象将负责实例化每个层所需的所有内容,使所有项目保持分离状态。