Dependency injection 如何使用Ninject约定绑定服务

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"))

这里有两个场景,我想用Ninject.Extensions.Conventions解决

第一个是简单的:无论何时,只要请求来自包含单词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以找出参数并传递它们。是否有一种方法可以通过反射来识别参数,。。。那么您如何通过依赖项注入获得参数的值呢??您可能想看看并了解参数识别和解析是如何在那里完成的。非常感谢,您的代码和解释对我帮助很大!