簡體   English   中英

三層asp.net mvc應用程序中的依賴注入

[英]Dependency Injection in a 3 layer asp.net mvc application

我有一個3層應用程序,圖層是:

  • Web:表示層(ASP.NET MVC) - >只看到BLL
  • BLL:業務邏輯層 - >只能看到DAL
  • DAL:數據訪問層

因此, Web層對我的DAL層一無所知。 我在DAL有存儲庫接口和具體類,它們在業務邏輯類的BLL層中使用。 問題是,為了解耦DALBLL ,如何設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM