它更多关于泛型,而不是NInject,但我很好奇。
以下正常运作。
kernel.Bind(typeof(IEntityRepository<,>)).To(typeof(LoggerRepository<,>));
但是如果我想使用泛型?以下给出了编译时错误。
kernel.Bind<IEntityRepository<,>>().To<LoggerRepository<IEntity<>,int>();
或
kernel.Bind<IEntityRepository<,>>().To<LoggerRepository<,>();
我确信我错过了一些非常简单的东西,并且必须在ST中找到答案。有人可以指点我的答案吗?
修改:以下可以正常使用。
kernel.Bind<IEntityRepository<AppUser, int>>().To<EntityRepository<AppUser, int>>();
但我想应该有一种方法而不指定类型(AppUse和int)。
答案 0 :(得分:1)
如果未指定泛型的所有类型参数,则不能在typeof()以外的任何表达式中使用它们。本文对您有所帮助:Unbound Generics: an Open and Closed Case
我特别提到这一部分,讨论了未绑定泛型与依赖注入的结合使用:
使用代码执行注册时,也省略了类型参数;例如RegisterType(typeof(MyTypes.IMyInterface&lt;,&gt;))。如前所述,Microsoft表示&#34; typeof运算符可以对未绑定的泛型类型(尚未具有特定类型参数的泛型类型)进行操作&#34;
修改强>
一般来说,使用带有依赖注入的未绑定泛型将导致令人困惑且难以阅读的代码。如果我没有弄错的话,你会尝试这样做,因为你可以对类型参数施加约束。
但为什么不直接为您使用的类型定义父接口?当然,你会失去限制,但在这样的情况下他们真的有必要吗?您已经在一个位置控制绑定,这是您的DI容器。当您的泛型类型通过其他人将使用的API公开时,主要使用约束。通常,客户端不会通过DI容器连接该代码,因为它们将使用派生类,工厂或直接实例化它。
你有什么特别的理由想这样做吗?
编辑#2:
也许你正在寻找这个?
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
然后,当您在调用代码中使用IRepository<SomeEntity>
作为构造函数参数时,ninject将在运行时以Repository<SomeEntity>
为您解析此问题。