C# 为在Autofac中解析已注册的开放泛型提供委托

C# 为在Autofac中解析已注册的开放泛型提供委托,c#,generics,autofac,C#,Generics,Autofac,我有这样一个界面: ICreator<T> {} var creator = container.Resolve<ICreator<IUser>>(); ICreator{} 我想做的是让用户像这样解决依赖关系: ICreator<T> {} var creator = container.Resolve<ICreator<IUser>>(); var creator=container.Resolve(); 诀

我有这样一个界面:

ICreator<T> {}
var creator = container.Resolve<ICreator<IUser>>();
ICreator{}
我想做的是让用户像这样解决依赖关系:

ICreator<T> {}
var creator = container.Resolve<ICreator<IUser>>();
var creator=container.Resolve();
诀窍是我希望能够为
ICreator
自定义创建具体类型。在我的例子中,我有一个
Creator
,它的构造函数采用了一个泛型类型,该泛型使用
tcontcrete
。按照惯例,我知道
T混凝土的类型应该被赋予
ICreator
中定义的
T
,但是
RegisterGeneric
似乎没有给我所需要的,它是创建
Creator
实例的委托


或者这确实存在于Autofac中,而我却错过了它?任何洞察都将不胜感激-TIA。

您可以为具体类型注册特定的创建者。样本:

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();
    }
}
公共接口ICreator
{
void WriteName();
}
公共类创建者:ICreator
{
公共无效WriteName()
{
WriteLine(“我是标准创建者:”+typeof(T).FullName);
}
}
公共类CustomIntCreator:ICreator
{
公共无效WriteName()
{
Console.WriteLine(“我是定制int创建者”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
ContainerBuilder cb=新的ContainerBuilder();
cb.RegisterGeneric(typeof(Creator)).As(typeof(ICreator));
cb.RegisterType().As();
var container=cb.Build();
var intCreator=container.Resolve();
var standardCreator=container.Resolve();
intCreator.WriteName();//写入“我是自定义int创建者”
standardCreator.WriteName();//写入“我是标准创建者:System.Double”
Console.ReadLine();
}
}

使用
on激活
ReplaceInstance
是实现我所需的必要挂钩:

builder.RegisterGeneric(typeof(FakeCreator<>)).As(typeof(ICreator<>)).OnActivating(args =>
    {
        // ...
        args.ReplaceInstance(new Creator<...,...>());
    });
builder.RegisterGeneric(typeof(FakeCreator)).As(typeof(ICreator)).on激活(args=>
{
// ...
args.ReplaceInstance(新创建者());
});

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

我认为这不是我要找的。我希望指定
ICreator
,并返回
Creator
,其中
Creator
实现
ICreator
。我可以在code-
ICreator creator=new creator()
中手动执行此操作,但我找不到在Autofac中注册此类配置的方法。一个有效的方法是在激活时钩住
并调用
ReplaceInstance
。这正是我所要寻找的,但它有一个小的负面工件,因为它将创建我在
RegisterGeneric
中提供的泛型类型的实例,我无论如何都要替换它。