我错过了什么?
你错过了一个工厂。
想想看,没有魔法妖精在后台猜测你需要的类型。你需要提供它。通过明确说明T
配置时的内容,如下所示:
container.RegisterType(
typeof(IInterface),
typeof(Class<SomeType>));
T
或者通过创建一个在运行时传递的工厂:
public interface IInterfaceFactory
{
IInterface Create<T>();
}
工厂可以注册如下:
container.RegisterInstance<IInterfaceFactory>(
new InterfaceFactory(container));
一个实现可以如下所示:
public class InterfaceFactory : IInterfaceFactory
{
private readonly IUnityContainer container;
public InterfaceFactory(IUnityContainer container)
{
this.container = container;
}
public IInterface Create<T>()
{
return this.container.Resolve<Class<T>>();
}
}
现在您可以将 注入IInterfaceFactory
需要使用的消费者,IInterface
他们可以通过调用该Create<T>()
方法来请求他们需要的版本。
更新
如果你觉得这个代码太多,你也可以注册一个工厂委托,如下:
container.RegisterInstance<Func<Type, IInterface>>(
type => container.Resolve(
typeof(Class<>).MakeGenericType(type)));
这基本相同,但现在内联在委托中。您的消费者现在可以依赖 aFunc<Type, IInterface>
而不是 aIInterfaceFactory
并将类型实例传递给委托。
我个人更喜欢使用描述性界面,例如IInterfaceFactory
. 由你决定。