4

我的场景(对我来说)看起来非常简单,但我找不到解决方案。

我有这种情况

public class Class<T> : IInterface where T : class
{ 

}

接口不能通用(来自 WCF 库。)

所以我想像这样注册接口

container.RegisterType(typeof (IInterface ), typeof (Class<>));

然后用 T 解决它

我该怎么做?我错过了什么?

我的意图是做类似的事情

container.Resolve<IInterface>(/* specify T */);
4

2 回答 2

8

如果您不需要使用非受控接口进行解析,您可以制作自己的受控接口,该接口使用泛型并派生自非受控接口。然后您可以注册开放的泛型并解析封闭的泛型类型。

public interface IControlled<T> : IUncontrolled {}
public class Controlled<T> : IControlled<T> {}

container.RegisterType(typeof(IControlled<>), typeof(Controlled<>));

IUncontrolled instance = container.Resolve<IControlled<string>>();
于 2013-08-30T05:41:28.370 回答
8

我错过了什么?

你错过了一个工厂。

想想看,没有魔法妖精在后台猜测你需要的类型。你需要提供它。通过明确说明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. 由你决定。

于 2013-08-28T08:12:34.277 回答