2013-02-22 52 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将创建配置泛型类型的实例,但它的作品。