Ninject.Extensions.Factory 具有非泛型类型参数
Ninject.Extensions.Factory with non-generic type parameter
我知道我可以使用 ToFactory
方法绑定以下通用接口。
public interface IFoo {}
public interface IFooFactory {
TFoo Create<TFoo>() where TFoo : IFoo;
}
...
kernel.Bind<IFooFactory>().ToFactory();
此代码按预期工作。但是,如果我想使用非通用变体,我会得到一个 Ninject 激活异常,因为它搜索 IFoo
的绑定,因此工厂扩展似乎无法识别 [=15] =] 参数。
public interface IFooFactoryWithType {
IFoo Create(Type concreteType);
}
...
kernel.Bind<IFooFactoryWithType>().ToFactory();
是我做错了什么,还是不支持这种方式?在我当前的场景中,我不能使用通用版本,因为类型来自运行时参数。当然,我可以对 MakeGenericMethod
和朋友使用一些反射 hack,但我想避免这种情况。
开箱即用不支持。但是您可以通过以下方式将 IInstanceProvider
与自定义实现交换:
kernel.Bind<IFooFactory>()
.ToFactory(() => new MyCustomInstanceProvider());
另请参阅 wiki 了解更多信息。
此外 您可能会感兴趣。
您的 IInstanceProvider
实现可能看起来像那样(抱歉,我还没有测试它是否真的编译):
internal class TypeDefinedByArgumentInstanceProvider : StandardInstanceProvider
{
protected override Type GetType(MethodInfo methodInfo, object[] arguments)
{
return (Type)arguments.Single();
}
}
kernel.Bind<IFooFactory>()
.ToFactory(() => new TypeDefinedByArgumentInstanceProvider());
我不确定我是否正确回答了你的问题。
是不是你必须把 IFoo 绑定到你的具体类型?
kernel = new StandardKernel();
kernel.Bind(typeof(IFoo)).To<Class2>();
kernel.Bind<IFooFactoryWithType>().ToFactory();
var createdInstance = kernel.Get<IFooFactoryWithType>().Create(typeof(IFoo));
我知道我可以使用 ToFactory
方法绑定以下通用接口。
public interface IFoo {}
public interface IFooFactory {
TFoo Create<TFoo>() where TFoo : IFoo;
}
...
kernel.Bind<IFooFactory>().ToFactory();
此代码按预期工作。但是,如果我想使用非通用变体,我会得到一个 Ninject 激活异常,因为它搜索 IFoo
的绑定,因此工厂扩展似乎无法识别 [=15] =] 参数。
public interface IFooFactoryWithType {
IFoo Create(Type concreteType);
}
...
kernel.Bind<IFooFactoryWithType>().ToFactory();
是我做错了什么,还是不支持这种方式?在我当前的场景中,我不能使用通用版本,因为类型来自运行时参数。当然,我可以对 MakeGenericMethod
和朋友使用一些反射 hack,但我想避免这种情况。
开箱即用不支持。但是您可以通过以下方式将 IInstanceProvider
与自定义实现交换:
kernel.Bind<IFooFactory>()
.ToFactory(() => new MyCustomInstanceProvider());
另请参阅 wiki 了解更多信息。
此外
您的 IInstanceProvider
实现可能看起来像那样(抱歉,我还没有测试它是否真的编译):
internal class TypeDefinedByArgumentInstanceProvider : StandardInstanceProvider
{
protected override Type GetType(MethodInfo methodInfo, object[] arguments)
{
return (Type)arguments.Single();
}
}
kernel.Bind<IFooFactory>()
.ToFactory(() => new TypeDefinedByArgumentInstanceProvider());
我不确定我是否正确回答了你的问题。 是不是你必须把 IFoo 绑定到你的具体类型?
kernel = new StandardKernel();
kernel.Bind(typeof(IFoo)).To<Class2>();
kernel.Bind<IFooFactoryWithType>().ToFactory();
var createdInstance = kernel.Get<IFooFactoryWithType>().Create(typeof(IFoo));