我有这样的界面:
ICreator<T> {}
我想要做的是让用户像这样解决依赖关系:
var creator = container.Resolve<ICreator<IUser>>();
诀窍在于我希望能够为ICreator<T>
自定义创建具体类型。在我的例子中,我有一个带有构造函数的Creator<T, TConcrete>
,它带有一个使用TConcrete
的泛型的类型。按照惯例,我知道TConcrete
的{{1}}类型应该T
定义ICreator
,但RegisterGeneric
似乎不能满足我的需要,这是委托创建Creator<,>
实例。
或者这可能确实存在于Autofac中,而我却错过了它?任何见解将不胜感激 - TIA。
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
使用OnActivating
和ReplaceInstance
是完成我需要的必要工具:
builder.RegisterGeneric(typeof(FakeCreator<>)).As(typeof(ICreator<>)).OnActivating(args =>
{
// ...
args.ReplaceInstance(new Creator<...,...>());
});
这并不完美,因为Autofac会创建配置的泛型类型的实例,但它可以工作。