具有非泛型类型参数

时间:2016-02-16 16:37:10

标签: c# ninject ninject-extensions

我知道我可以使用ToFactory方法绑定以下通用接口。

public interface IFoo {}
public interface IFooFactory {
  TFoo Create<TFoo>() where TFoo : IFoo;
}

...

kernel.Bind<IFooFactory>().ToFactory();

此代码按预期工作。但是,如果我想使用非泛型变体,我会得到一个Ninject激活异常,因为它会搜索IFoo的绑定,因此工厂扩展似乎无法识别Type参数。

public interface IFooFactoryWithType {
  IFoo Create(Type concreteType);
}

...

kernel.Bind<IFooFactoryWithType>().ToFactory();

我做错了什么,或者这种方式不支持?在我当前的场景中,我不能使用通用版本,因为类型来自运行时参数。我当然可以和MakeGenericMethod和朋友一起使用反思黑客,但我想避免这种情况。

2 个答案:

答案 0 :(得分:1)

不支持开箱即用。但您可以通过以下方式将IInstanceProvider与自定义实现交换:

kernel.Bind<IFooFactory>()
    .ToFactory(() => new MyCustomInstanceProvider());

另请参阅wiki了解详情。

此外Ninject factory create T based on enum可能对您感兴趣。

您的IInstanceProvider实施可能看起来像那样(我还没有测试它是否实际编译,抱歉):

internal class TypeDefinedByArgumentInstanceProvider : StandardInstanceProvider
{
    protected override Type GetType(MethodInfo methodInfo, object[] arguments)
    {
        return (Type)arguments.Single();
    }
}

kernel.Bind<IFooFactory>()
    .ToFactory(() => new TypeDefinedByArgumentInstanceProvider());

答案 1 :(得分:0)

我不确定我的问题是否正确。 你不得不将IFoo绑定到你的具体类型吗?

     kernel = new StandardKernel();
     kernel.Bind(typeof(IFoo)).To<Class2>();
     kernel.Bind<IFooFactoryWithType>().ToFactory();
     var createdInstance = kernel.Get<IFooFactoryWithType>().Create(typeof(IFoo));