0

我有一个这样的界面:

ICreator<T> {}

我想要做的是让用户像这样解决依赖关系:

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

诀窍是我希望能够为ICreator<T>. 就我而言,我有一个Creator<T, TConcrete>带有构造函数的构造函数,该构造函数采用具有泛型的类型,该类型使用TConcrete. 按照惯例,我知道TConcrete应该给什么类型T定义 in ICreator,但RegisterGeneric似乎它没有给我我需要的东西,它是创建Creator<,>实例的委托。

或者也许这在 Autofac 中确实存在而我错过了它?任何见解将不胜感激 - TIA。

4

2 回答 2

1

使用OnActivatingandReplaceInstance是完成我需要的必要钩子:

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

它并不完美,因为 Autofac 将创建配置的泛型类型的实例,但它可以工作。

于 2013-03-12T13:37:10.870 回答
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();
    }
}
于 2013-02-22T08:09:21.720 回答