[英]Dependency Injection in a 3 layer asp.net mvc application
我有一個3層應用程序,圖層是:
因此, 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<IDatabase>().To<ConcreteDatabase();
從控制器到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文件中,使用反射來訪問業務和數據層,以便您可以加載所需的一切
像這樣:
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”方法查找程序集中繼承ninject類“NinjectModule”的任何類,然后調用它將所有內容加載到內核中。
因此,我們的業務和數據層都包含一個簡單的注入類,我們用它來加載所有內容。
public class InjectionModuleBiz : NinjectModule
{
public override void Load()
{
Kernel.Bind<ICustomerBiz>().To<CustomerBiz>().InRequestScope();
Kernel.Bind<IEmployeeBiz>().To<EmployeeBiz>().InRequestScope();
}
}
我們在數據層中有另一個injectModule類
public class InjectionModuleData : NinjectModule
{
public override void Load()
{
Kernel.Bind<ICustomerData>().To<CustomerData>().InRequestScope();
Kernel.Bind<IEmployeeData>().To<EmployeeData>().InRequestScope();
}
}
最終結果是我們的所有業務層和數據層類都加載到我們的ioc容器中,並且可以在任何地方注入。
希望有所幫助。
我同意在使用Visual Studio在N層應用程序中使用依賴注入時會有很多困惑。
主要是因為在Visual Studio中,我們將層構建為解決方案中的不同項目,並通過引用項目或DLL來添加依賴項。 這與DI和Composition Root概念的原理完全不同。
基本問題是我們注入的依賴項是什么?
業務邏輯或存儲庫?
如果它是存儲庫,是的,你是對的,Web層不需要知道它。 BLL根據特定條件選擇存儲庫。
如果我們有完全隔離的應用程序,我們需要在兩個級別設置DI。
您的Web應用程序需要設置ninject來創建BLL組件。 BLL應用程序將設置ninject以創建一組特定的邏輯和存儲庫類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.