2015-04-01 209 views
0

它比泛型更像泛型,但我很好奇。如何使用泛型类型参数调用泛型方法

以下正在正常工作

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

如果未指定泛型的所有类型参数,则不能在typeof()以外的任何表达式中使用它们。这篇文章能为您有所帮助:Unbound Generics: an Open and Closed Case

我指的是这部分特别,它讨论结合使用未绑定的泛型与依赖注入:

当您使用代码来执行注册,你也省略了类型参数;例如RegisterType(typeof(MyTypes.IMyInterface <,>))。正如前面看到的,微软表示,“typeof运算符可以在绑定的泛型类型进行操作(即还没有具体的类型参数泛型类型)”

编辑:

一般来说,使用未绑定泛型与依赖注入将导致混淆和难以阅读的代码。如果我没有弄错,你正在试图这样做,因为你可以将这些限制放在类型参数上。

但是,为什么不只是为你使用的类型定义一个父接口呢?当然,你会失去约束,但是在这样的情况下他们真的需要吗?您已经在控制一个位置的绑定,这是您的DI容器。当通用类型通过其他人将使用的API公开时,主要使用约束。通常,代码不会通过客户端的DI容器连线,因为他们将使用派生类,工厂或直接实例化它。

你有什么特别的理由想要这样做吗?

编辑#2:

也许你正在寻找呢?

kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)); 

然后,当你有IRepository<SomeEntity>在调用代码构造函数的参数,ninject会为您解决问题为Repository<SomeEntity>在运行时。

+0

嗨弗雷德,谢谢你的文章,它帮助了我。我想我几年前就知道这种无约束泛型的概念,但现在它已经从我的脑海中消失了。和我说的kernel.Bind(typeof(IEntityRepository <,>))。(typeof(LoggerRepository <,>));工作得很好。所以我会去用它。 – VivekDev 2015-04-02 06:00:01

相关问题