三层asp.net mvc应用程序中的dependency injection
我有一个3层应用程序,层是:
- Web:表示层(ASP.NET MVC) – >只能看到BLL
- BLL:业务逻辑层 – >只能看到DAL
- DAL:数据访问层
因此, Web
层对我的DAL
层一无所知。 我在DAL
有存储库接口和具体类,它们在业务逻辑类的BLL
层中使用。 问题是,为了解耦DAL
和BLL
,如何设置Ninject以将我的存储库实现注入BLL
层?
同样的问题是Web
层和BLL
层,我在BLL
上有接口和实现,我在Web
层使用它们,我应该如何为此设置Niject?
我们的想法是为您的DAL和BLL定义接口。 然后,您将此类接口的实例作为构造函数参数。 例
interface IDatabase { // Methods here }
你的BLL课程:
public class Bll { IDatabase _db; public Bll(IDatabase db) { _db = db; } public void SomeMethod() { // Use db here } }
然后在组合根(在Web应用程序中)中使用内核来配置这些依赖项:
kernel.Bind().To
从控制器到BLL需要相同的东西,但它的工作方式相同。
除此之外,我认为你的依赖关系没有正确设置。 通常,您不希望这些垂直依赖项。 你应该瞄准更平坦的等级制度。 我写了一篇关于此的博文: http : //www.kenneth-truyers.net/2013/05/12/the-n-layer-myth-and-basic-dependency-injection/
在我的博客文章中,我解释了这种层次结构的问题是什么,以及如何避免它。 除此之外,它描述了你的问题:ASP.NET MVC,BLL,DLL和Ninject将它们联系在一起。
我们在企业级应用程序中也遇到了这个问题。 如何使用业务和数据层中的类加载依赖项注入引擎,而无需从Web应用程序创建对业务和数据层的硬引用。 我们最初玩了一些设计,并提出了这个非常成功的设计,到目前为止我们已经为我们工作了18个月并且表现非常好。
在Web应用程序的ninjectwebcommon文件中,使用reflection来访问业务和数据层,以便您可以加载所需的所有内容
像这样:
System.Reflection.Assembly assembly; assembly = System.Reflection.Assembly.Load("our.biztier"); kernel.Load(assembly); assembly = System.Reflection.Assembly.Load("our.datatier"); kernel.Load(assembly);
Ninjects“Load”方法查找程序集中inheritanceninject类“NinjectModule”的任何类,然后调用它将所有内容加载到内核中。
因此,我们的业务和数据层都包含一个简单的注入类,我们用它来加载所有内容。
public class InjectionModuleBiz : NinjectModule { public override void Load() { Kernel.Bind().To().InRequestScope(); Kernel.Bind().To().InRequestScope(); } }
我们的数据层中有另一个injectionModule类
public class InjectionModuleData : NinjectModule { public override void Load() { Kernel.Bind().To().InRequestScope(); Kernel.Bind().To().InRequestScope(); } }
最终结果是我们的所有业务层和数据层类都加载到我们的ioc容器中,并且可以在任何地方注入。
希望有所帮助。
我同意在使用Visual Studio在N层应用程序中使用dependency injection时会有很多困惑。
主要是因为在Visual Studio中,我们将层构建为解决方案中的不同项目,并通过引用项目或DLL来添加依赖项。 这与DI和Composition Root概念的原理完全不同。
基本问题是我们注入的依赖项是什么?
业务逻辑或存储库?
如果它是存储库,是的,你是对的,Web层不需要知道它。 BLL根据特定条件选择存储库。
如果我们有完全隔离的应用程序,我们需要在两个级别设置DI。
您的Web应用程序需要设置ninject来创建BLL组件。 BLL应用程序将设置ninject以创建一组特定的逻辑和存储库类。