簡體   English   中英

Unity的通用依賴注入

[英]Generic dependency injection with Unity

我們將現有的日志記錄庫包裝在我們自己的C#應用​​程序中的日志記錄服務中,以便使用預定義的方法為特定的日志記錄情

public class LoggingBlockLoggingService : ILoggingService
{
    private LogWriter writer;

    public LoggingBlockLoggingService(LogWriter writer)
    {
        this.writer = writer;
    }
    ....//logging convenience methods, LogWarning(), etc...
}

我想修改這個實現,以便它接受實例化它的類的類型(底層記錄器,在這種情況下,LogWriter將是一個單例)。 所以要么使這個實現(和接口ILoggingService)通用:

public class LoggingBlockLoggingService<T> : ILoggingService<T>
{
    ...
    private string typeName = typeof(T).FulName;
    ...

或者添加一個額外的構造函數參數:

public class LoggingBlockLoggingService : ILoggingService
{
    private LogWriter writer;
    private string typeName;

    public LoggingBlockLoggingService(LogWriter writer, Type type)
    {
        this.writer = writer;
        this.typeName = type.FullName;
    }
    ....//Include the typeName in the logs so we know the class that is logging.
}

在注冊我們的類型時,有沒有辦法在Unity中配置一次 我想避免為每個想要記錄的類添加一個條目。 理想情況下,如果有人想在我們的項目中向類中添加日志記錄,他們只需將ILoggingService添加到他們正在使用的類的構造函數中,而不是在我們的unity配置中添加另一行來注冊他們正在處理的每個類。 。

我們使用的是運行時/代碼配置,而不是XML

是的,你可以使用:

container.RegisterType(typeof(IMyGenericInterface<>), typeof(MyConcreteGenericClass<>));

在你的情況下,當有簡單的直接泛型參數 - 通用 - 參數映射時,Unity實際上可以處理它,但我懷疑是否有任何更高級的情況都沒有處理,因為在某些時候某些東西必須提供映射類型之間的泛型參數(謊言重新排序鍵值與價值鍵等)。

如果Dave的答案還不夠,我相當肯定你可以為Unity / ObjectBuilder寫一個插件,它會注冊一個新策略或一套策略,它們可以覆蓋你想要的任何類型映射,包括自動裝配掃描或物化仿制葯。

請參閱http://www.orbifold.net/default/unity-objectbuilder-part-ii/上的系列文章以及附近的部分

Context.Strategies.AddNew< buildkeymappingstrategy >(UnityBuildStage.TypeMapping);

暫無
暫無

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

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