如何使用泛型类型参数调用泛型方法

时间:2015-04-01 14:23:05

标签: .net generics ninject

它更多关于泛型,而不是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)。

1 个答案:

答案 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>为您解析此问题。