例如:
interface IFoo { }interface Ibar { }interface IRepository<T> { }class FooRepository<T> : IRepository<T> where T : IFoo { }class barRepository<T> : IRepository<T> where T : Ibar { }class Foo : IFoo { }class bar : Ibar { }class Program{ static voID Main(string[] args) { IKernel kernel = new StandardKernel(); // Use this binding only where T : IFoo kernel.Bind(typeof(IRepository<>)).To(typeof(FooRepository<>)); // Use this one only where T : Ibar kernel.Bind(typeof(IRepository<>)).To(typeof(barRepository<>)); var fooRepository = kernel.Get<IRepository<Foo>>(); var barRepository = kernel.Get<IRepository<bar>>(); }}
按原样调用此代码将产生多个激活路径异常: –
Error activating IRepository{Foo}: More than one matching bindings are available.
如何设置绑定以T的值为条件?理想情况下,我希望他们从目标类型中获取约束,因为我已经在那里定义了它们,但是如果我必须在绑定中再次定义它们也是可以接受的.
解决方法 也许有一个更清洁的解决方案,但它绝对适用于When contextual binding方法和一些反思:// Use this binding only where T : IFookernel.Bind(typeof(IRepository<>)).To(typeof(FooRepository<>)) .When(r => typeof(IFoo).IsAssignableFrom(r.Service.GetGenericArguments()[0]));// Use this one only where T : Ibarkernel.Bind(typeof(IRepository<>)).To(typeof(barRepository<>)) .When(r => typeof(Ibar).IsAssignableFrom(r.Service.GetGenericArguments()[0]));总结
以上是内存溢出为你收集整理的c# – Ninject – 绑定带约束的泛型类型全部内容,希望文章能够帮你解决c# – Ninject – 绑定带约束的泛型类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)