Dependency injection 如何使用Ninject约定绑定服务
这里有两个场景,我想用Ninject.Extensions.Conventions解决 第一个是简单的:无论何时,只要请求来自包含单词service的命名空间的实例,就返回唯一匹配类的单例实例。我这样试过:Dependency injection 如何使用Ninject约定绑定服务,dependency-injection,ninject,conventions,ninject-extensions,Dependency Injection,Ninject,Conventions,Ninject Extensions,这里有两个场景,我想用Ninject.Extensions.Conventions解决 第一个是简单的:无论何时,只要请求来自包含单词service的命名空间的实例,就返回唯一匹配类的单例实例。我这样试过: Kernel.Bind(service => service.FromThisAssembly() .Select(theClass => theClass.Namespace.Contains("Service"))
Kernel.Bind(service => service.FromThisAssembly()
.Select(theClass => theClass.Namespace.Contains("Service"))
.BindDefaultInterface()
.Configure(binding => binding.InSingletonScope()));
这些服务中的一些得到了解决,但当解决链到达Impl1依赖于IService2的点时,我遇到了ActivationException
这种装订有什么问题
第二个可能同样简单。所有继承基类的类都应该通过一个方法实例化。这是我到目前为止使用的解决方案代码,用于每个类:
Bind<MyViewModel>().ToMethod(ctx => fac.CreateProxy<MyViewModel>())
.InSingletonScope();
现在我需要让那家工厂开始运作
一般问题:
扩展的绑定方式。约定似乎与常规方式完全相反:
尼尼特:绑定。到
约定:SelectAllClasses.BindDefaultInterface
为什么会这样,或者我误解了这一点
我曾经将绑定放在从NinjectModule派生的类中,我更愿意继续这样做。使用Extensions.Conventions时,有没有不这样做的原因
第一:
请发布确切的ActivationException消息+Stacktrace。
很可能IService2的绑定丢失或存在循环依赖关系
第二:
使用绑定生成器:
public override void Load()
{
this.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<BaseClass>()
.BindWith<ToSelfProxyBindingGenerator>()
.Configure(binding => binding.InSingletonScope()));
}
public class ToSelfProxyBindingGenerator : IBindingGenerator
{
public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot)
{
yield return bindingRoot
.Bind(type)
.ToMethod(ctx => fac.CreateProxy(type));
}
}
还要注意,单例作用域可以由IBindingGenerator或@convention使用.Configure.定义。。方法
一般问题:
你是对的,但我不能告诉你背后的确切原因。
不,将约定放在不同的模块中是完全正确的。我们也在这样做,而且效果非常好。
第一:
请发布确切的ActivationException消息+Stacktrace。
很可能IService2的绑定丢失或存在循环依赖关系
第二:
使用绑定生成器:
public override void Load()
{
this.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<BaseClass>()
.BindWith<ToSelfProxyBindingGenerator>()
.Configure(binding => binding.InSingletonScope()));
}
public class ToSelfProxyBindingGenerator : IBindingGenerator
{
public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot)
{
yield return bindingRoot
.Bind(type)
.ToMethod(ctx => fac.CreateProxy(type));
}
}
还要注意,单例作用域可以由IBindingGenerator或@convention使用.Configure.定义。。方法
一般问题:
你是对的,但我不能告诉你背后的确切原因。
不,将约定放在不同的模块中是完全正确的。我们也在这样做,而且效果非常好。
关于您的第一个示例,您可以发布一个示例吗?您如何尝试解析服务名称apces中的类型?这里有一个示例,第一个代码段不,这是注册部分,我对您如何使用/解析regsitered类型感兴趣,以便获得ActivationExceptionAh,好的。我将把这部分添加到post更新后的post中,问题与我所想的有点不同…关于你的第一个示例,你能发布一个示例吗?你如何尝试解析服务名称APCES中的类型?这里有一个示例,第一个代码段不,这是注册部分,我感兴趣的是如何使用/解析regsitered类型,以便获得ActivationExceptionAh,好的。我会把这部分添加到帖子中。我更新了帖子,问题与我想象的有点不同。谢谢你的回复。首先,感谢您提供的示例代码-它工作正常。尽管如此,我有时需要使用附加参数调用fac.CreateProxytype。我怎样才能把它们传进来?有点违背常规思维,不是吗?依赖于特定类型的附加参数肯定超出了常规范围。根据成本的不同,您可以选择过滤这些参数并单独绑定它们,或者调整BindingGenerator以找出参数并传递它们。是否有一种方法可以通过反射来识别参数,。。。那么您如何通过依赖项注入获得参数的值呢??您可能想看看并了解参数识别和解析是如何在那里完成的。非常感谢,您的代码和解释对我帮助很大!谢谢你的回复。首先,感谢您提供的示例代码-它工作正常。尽管如此,我有时需要使用附加参数调用fac.CreateProxytype。我怎样才能把它们传进来?有点违背常规思维,不是吗?依赖于特定类型的附加参数肯定超出了常规范围。根据成本的不同,您可以选择过滤这些参数并单独绑定它们,或者调整BindingGenerator以找出参数并传递它们。是否有一种方法可以通过反射来识别参数,。。。那么您如何通过依赖项注入获得参数的值呢??您可能想看看并了解参数识别和解析是如何在那里完成的。非常感谢,您的代码和解释对我帮助很大!