Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 依赖注入解决方案体系结构_Architecture_Dependency Injection - Fatal编程技术网

Architecture 依赖注入解决方案体系结构

Architecture 依赖注入解决方案体系结构,architecture,dependency-injection,Architecture,Dependency Injection,将我的解决方案的不同层抽象为单独的项目(例如DataAccess、BusinessLogic、ApplicationService、UserInterface(ASP.NET MVC))并强制上层只能引用下层,以确保上层的调用不能绕过此体系结构,我试图在我当前的项目中引入构造函数注入(使用Unity) 我对结果并不像我想象的那样高兴,我希望有更好的方法 在UI层的Global.asax中,我不喜欢这样,为了构建容器,我必须引用从每个层到数据访问存储库的每个项目。这感觉不对,因为现在多层设计可以很

将我的解决方案的不同层抽象为单独的项目(例如DataAccess、BusinessLogic、ApplicationService、UserInterface(ASP.NET MVC))并强制上层只能引用下层,以确保上层的调用不能绕过此体系结构,我试图在我当前的项目中引入构造函数注入(使用Unity)

我对结果并不像我想象的那样高兴,我希望有更好的方法

在UI层的Global.asax中,我不喜欢这样,为了构建容器,我必须引用从每个层到数据访问存储库的每个项目。这感觉不对,因为现在多层设计可以很容易地避免

你采取什么方法来避免这种情况?您是否为依赖项注入创建了一个单独的项目,并让该项目引用所有内容?那么UI层只需要引用依赖项注入项目

有没有更好的方法来实现这一点

提前感谢您的建议

这感觉不对,因为现在多层设计可以很容易地避免

嗯。你总是可以绕过这一点的。你也可以破解你的代码(或者任何其他有权访问它的程序员)。你可以引入bug。您可以跳过层并直接在UI层中使用EF

但你不会的,因为那是个坏习惯

但是,可以使用反射跳过这些引用(在运行时加载程序集)。问题是,其他程序集将不会自动包含在安装项目中或发布项目时

如果这不是一个问题,你想让一切都自动完成:使用我的容器。它让您在每个项目中都有一个合成根。然后,只需在UI层中执行以下操作即可加载所有其他程序集:

public void Application_Start(string[] args)
{
    var registrar = new ContainerRegistrar();

    // will load all modules from all assemblies which starts with "MyApp."
    registrar.RegisterModules(Environment.CurrentDirectory, "MyApp.*.dll");

    var container = registrar.Build();
}
更详细的解释:

这感觉不对,因为现在多层设计可以很容易地避免

嗯。你总是可以绕过这一点的。你也可以破解你的代码(或者任何其他有权访问它的程序员)。你可以引入bug。您可以跳过层并直接在UI层中使用EF

但你不会的,因为那是个坏习惯

但是,可以使用反射跳过这些引用(在运行时加载程序集)。问题是,其他程序集将不会自动包含在安装项目中或发布项目时

如果这不是一个问题,你想让一切都自动完成:使用我的容器。它让您在每个项目中都有一个合成根。然后,只需在UI层中执行以下操作即可加载所有其他程序集:

public void Application_Start(string[] args)
{
    var registrar = new ContainerRegistrar();

    // will load all modules from all assemblies which starts with "MyApp."
    registrar.RegisterModules(Environment.CurrentDirectory, "MyApp.*.dll");

    var container = registrar.Build();
}
更详细的解释: