繁体   English   中英

C#依赖注入在同一解决方案上有3个项目

[英]C# Dependency Injection with 3 projects on same Solution

我有一个单独项目的解决方案。 结构如下:1-Web项目2-Aplicacao,由1的控制器调用以执行逻辑3-Dominio,具有我的解决方案的类4-Dados,具有实体框架东西...

因此,当我有一个POST来注册新用户时,将调用UsuarioController(UC)。 UC必须实例化通过使用权的UsuarioAplicacao(UA)。 UA必须实例化一个传递usuario作为参数的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将对象保存到DB中的类)上:

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

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

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

(_contexto是我的EF上下文类)

这些是我的讲师。 但是我得到了空引用异常...

你们可以帮我进行依赖注入吗?

Ninject我都不明白该怎么用...

提前致谢

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

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

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

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

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

在架构方面,我使用类似以下的内容:

网络-前端

业务-您在哪里开展业务规则

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

数据-声明实体和实体框架在其中进行低级操作的地方,例如打开连接,将内容保存到数据库等,以及声明存储库的位置

在该架构中:

网络访问合同和业务

业务访问合同和数据

数据无法访问任何内容

业务部门将向数据请求实体,数据将通过数据库中的实体模型进行回答,并且您需要执行的任何操作将在业务部门中完成,并返回(合同程序集的)数据传输对象,这些数据将被使用在前端(返回时),或定义新模型以使传输对象适合您的前端。

在这种情况下,请记住依赖注入,如果业务层知道如何创建数据层对象,则会创建一个耦合,因此,您无需配置,而是配置一个依赖注入容器,该对象将负责实例化所有每个层都需要,使您的所有项目脱钩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM