2013-04-04 135 views
3

我們正在將一個現有的日誌記錄庫封裝到C#應用程序中的自己的日誌記錄服務中,以便在某些日誌記錄情況下使用預定義的方法將它包圍。通用依賴注入與Unity

public class LoggingBlockLoggingService : ILoggingService 
{ 
    private LogWriter writer; 

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

我想,這樣只有在對其進行實例化類的類型來修改這個實現(底層記錄,日誌寫在這種情況下,將是一個單例)。因此,要麼讓這個實現(和接口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. 
} 

是否有註冊我們的類型時,配置此一次團結方式?我想避免爲每個想要登錄的課程添加條目。理想情況下,如果有人想將日誌記錄添加到項目中的類中,他們只需將ILoggingService添加到正在工作的類的構造函數中,而不是將另一行添加到我們的Unity配置中以註冊他們正在處理的每個類。

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

回答

8

是的,你可以使用:

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

+0

賓果,謝謝! 我曾嘗試類似的東西與container.RegisterType 。刪除尖括號並使用基本方法正是我所需要的。 – Dan 2013-04-04 15:24:03

0

在你的情況,如果有簡單的直接仿製PARAM - 以--generic-param映射Unity可能實際上處理了這個問題,但我懷疑沒有處理任何更高級的情況,因爲某些時間點的某些事物必須提供類型之間的泛型參數映射(liek reordering Key-Value vs 。Value-Key等)。

如果Dave的答案還不夠,我相當肯定你可以爲Unity/ObjectBuilder編寫一個插件,它將註冊一個新的策略或一組策略,這些策略或策略將涵蓋所有你想要的類型映射,包括自動組裝掃描或實現泛型。

看到http://www.orbifold.net/default/unity-objectbuilder-part-ii/的系列文章和部分附近

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