[英]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.