我有一个单独项目的解决方案。结构是这样的: 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我无法理解如何使用......
提前致谢
答案 0 :(得分:2)
您将获得空引用,因为您没有配置任何依赖项注入。简单地在控制器构造函数上传递参数是不够的,您必须实际告诉依赖注入器如何构造依赖项。
使用Unity,您可以在WebApiConfig上执行此类操作(如果在mvc上,则执行global.asax)
public static void UnityContext_OnRegisterComponents(Microsoft.Practices.Unity.UnityContainer container)
{
container.RegisterType<ICarRepository, CarRepository>(new HierarchicalLifetimeManager());
}
现在,对于依赖注入的概念,它用于保持项目之间的低耦合。您的控制器不能知道您的业务规则,也不知道如何创建属于另一个程序集的对象。
示例:当您创建存储库并直接在控制器上实例化您的实体时,您将在这些程序集之间创建依赖关系,这使得以后很难测试您的代码,也使其变得更加复杂。
在架构方面,我使用类似的东西:
网络 - 前端
业务 - 您的业务规则
合同 - 您声明数据传输对象的位置
数据 - 您声明实体的地方,实体框架执行低级别的操作,例如打开连接,将数据保存到数据库等,以及声明存储库的位置
在那个建筑中:
网络访问合同和业务
业务访问合同和数据
数据无法访问任何内容
业务将询问数据实体,数据将使用数据库中的实体模型进行回答,并且您需要执行的任何操作都将在业务中完成,返回数据传输对象(Contracts程序集),这将是它们可以在您的前端使用,无论是返回还是定义新模型以使传输对象适合您的前端。
在这种情况下,记住依赖注入,如果业务层知道如何创建数据层对象,它将创建一个耦合,所以不是这样做,而是配置一个依赖注入容器,该对象将负责实例化每个层所需的所有内容,使所有项目保持分离状态。