簡體   English   中英

3層架構中Unity的依賴注入

[英]Dependency injection with Unity in 3 tier architecture

我的Web API解決方案有3個項目:控制器層,業務層,數據訪問層。 Unity安裝在控制器層項目中,用於實現DI。 業務和數據層中的每個類都有一個與之關聯的接口。 現在如何在遵守DI標准的同時從A業務層訪問B業務層中的功能? 在業務層項目中未安裝Unity。 目前我正在做的是:

public class BBusiness
{
    IBDataAccess bDataAccess;
    IADataAccess aDataAccess;

    public BBusiness(IBDataAccess bDataAccessParam, IADataAccess 
    aDataAccessParam)
    {
        this.bDataAccess=bDataAccessParam;
        this.aDataAccess=aDataAccessParam;
    }
    public function()
    {
        ABusiness obj=new ABusiness(this.aDataAccess);
        obj.functionInABusiness();
    }
}

據我所知(我對DI很ABusiness ),您不應該在BBusiness創建對象BBusiness

你應該做的是

public function()
{
    aDataAccess.functionInClassThatImplementsInterfaceIADataAccess();
}

您的解決方案意味着BBusiness仍然依賴於ABusiness,您希望通過使用DI來避免這種情況。

這就是層次的整體思想:您不會從A訪問B中的功能。A忙於自己的業務,甚至都不知道B的存在。但是,B知道A,也知道A的事件(A提供的任何事件)並對它們做出反應。

由於ABusiness了它通常會被設置像一個服務:

public interface IABusiness
{
    void functionInABusiness();
}

public class ABusiness : IABusiness
{
    // making the variable private readonly ensures that nothing
    // can set it after the constructor does (thus it can never be null)
    private readonly IADataAccess aDataAccess;

    public ABusiness(IADataAccess aDataAccessParam)
    {
        // Guard clause ensures you cannot set this.aDataAccess to null
        if (aDataAccessParam == null)
            throw new ArgumentNullException(nameof(aDataAccessParam));
        this.aDataAccess=aDataAccessParam;
    }

    public void functionInABusiness()
    {
        // Do something with aDataAccess
    }
}

然后,您將IABusiness添加為IABusiness的依賴BBusiness

public interface IBBusiness
{
    void function();
}

public class BBusiness : IBBusiness
{
    private readonly IBDataAccess bDataAccess;
    private readonly IABusiness aBusiness;

    public BBusiness(IBDataAccess bDataAccessParam, IABusiness aBusinessParam)
    {
        if (bDataAccessParam == null)
            throw new ArgumentNullException(nameof(bDataAccessParam));
        if (aBusinessParam == null)
            throw new ArgumentNullException(nameof(aBusinessParam));
        this.bDataAccess=bDataAccessParam;
        this.aBusiness=aBusinessParam;
    }
    public function()
    {
        this.aBusiness.functionInABusiness();
        // Do something else...
    }
}

在您的組合根目錄中 ,然后將設置Unity以將IABusinessABusinessIBBusinessBBusiness相關聯。 請注意,如果類和接口以某種方式命名或放置在某個地方等,則某些項目使用的約定會自動執行此步驟。

container.RegisterType<IABusiness, ABusiness>();
container.RegisterType<IBBusiness, BBusiness>();
container.RegisterType<IADataAccess, ADataAccess>();
container.RegisterType<IBDataAccess, BDataAccess>();

整個想法是,你不引用ABusiness直接從類BBusiness類,所以你可以注入的不同實例IABusinessBBusiness (用於測試,或創建一個周圍裝飾類IABusiness ,增加了更多的責任,它等)

同樣, IABusiness接口可能與IABusiness位於不同的程序ABusiness (例如),因此BBusiness程序集不需要引用ABusiness程序集。

請注意,您沒有遵循Microsoft的大寫約定 ,這可能會使該代碼難以為您所遵循。 方法名稱在.NET中應為Pascal大小寫,例如FunctionInABusiness()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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