2013-02-22 48 views
0

我有一個這樣的接口:提供委託來解決註冊開仿製藥Autofac

ICreator<T> {} 

我想要做的就是讓用戶解決這樣的依賴性:

var creator = container.Resolve<ICreator<IUser>>(); 

的訣竅是我希望能夠爲ICreator<T>做一些自定義創建的具體類型。在我的情況下,我有一個Creator<T, TConcrete>帶有一個構造函數,該類型的泛型使用TConcrete。按照慣例,我知道TConcrete應該給T定義ICreator的類型,但RegisterGeneric看起來不像它給我我需要什麼,這是創建Creator<,>實例的代表。

或者這可能存在於Autofac中,我錯過了它?任何有識之士將不勝感激 - TIA。

回答

0

您可以註冊具體類型的特定創建者。示例:

public interface ICreator<T> 
{ 
    void WriteName(); 
} 

public class Creator<T> : ICreator<T> 
{ 
    public void WriteName() 
    { 
     Console.WriteLine("I'm standard creator: " + typeof(T).FullName); 
    } 
} 

public class CustomIntCreator : ICreator<int> 
{ 
    public void WriteName() 
    { 
     Console.WriteLine("I'm custom int creator"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ContainerBuilder cb = new ContainerBuilder(); 
     cb.RegisterGeneric(typeof (Creator<>)).As(typeof (ICreator<>)); 
     cb.RegisterType<CustomIntCreator>().As<ICreator<int>>(); 
     var container = cb.Build(); 

     var intCreator = container.Resolve<ICreator<int>>();    
     var standardCreator = container.Resolve<ICreator<double>>(); 
     intCreator.WriteName(); //writes "I'm custom int creator" 
     standardCreator.WriteName(); //writes "I'm standard creator: System.Double" 

     Console.ReadLine(); 
    } 
} 
+0

我不認爲這就是我要找的。我想要指定'ICreator ',並返回'Creator ',其中'Creator '實現'ICreator '。我可以在代碼中手動執行此操作 - 但是我無法找到在Autofac中註冊這種配置的方法。 – JasonBock 2013-02-22 14:03:46

+0

工作的一件事是鉤住OnActivating並調用ReplaceInstance。這幾乎是我正在尋找的東西,但是它有一個小的負面工件,它將創建一個我在'RegisterGeneric'中提供的泛型類型的實例,我將會替換它。 – JasonBock 2013-02-22 15:22:20

0

使用OnActivatingReplaceInstance是必要的鉤來完成我需要:

builder.RegisterGeneric(typeof(FakeCreator<>)).As(typeof(ICreator<>)).OnActivating(args => 
    { 
     // ... 
     args.ReplaceInstance(new Creator<...,...>()); 
    }); 

它不是完美的,因爲Autofac將創建配置泛型類型的實例,但它的作品。