Iai*_*way 5 .net c# dependency-injection ninject ioc-container
是否可以设置 ninject 绑定来遵守通用约束?
例如:
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>>();
}
}
Run Code Online (Sandbox Code Playgroud)
按原样调用此代码将产生多个激活路径异常:-
激活 IRepository{Foo} 时出错:有多个匹配的绑定可用。
如何设置以 T 值为条件的绑定?理想情况下,我希望它们从目标类型中获取约束,因为我已经在那里定义了它们,但如果我必须在绑定中再次定义它们也是可以接受的。
也许有一个更干净的解决方案,但它肯定适用于When 上下文绑定方法和一些反射:
// Use this binding only where T : IFoo
kernel.Bind(typeof(IRepository<>)).To(typeof(FooRepository<>))
.When(r => typeof(IFoo).IsAssignableFrom(r.Service.GetGenericArguments()[0]));
// Use this one only where T : IBar
kernel.Bind(typeof(IRepository<>)).To(typeof(BarRepository<>))
.When(r => typeof(IBar).IsAssignableFrom(r.Service.GetGenericArguments()[0]));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |