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
中提供的泛型类型的实例,我无论如何都要替换它。