NInject IBindingGenerator和ToProvider

时间:2015-08-06 14:11:33

标签: ninject

我已创建此代码:

public class AddonsModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        this.Bind(b => b.FromAssembliesMatching("*")
            .SelectAllClasses()
            .InheritedFrom(typeof(UIExtensibility.AbstractAddon))
            .BindWith(new AddonBindingGenerator())
        );
    }

    private class AddonBindingGenerator : IBindingGenerator
    {

        public System.Collections.Generic.IEnumerable<Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(System.Type type, Ninject.Syntax.IBindingRoot bindingRoot)
        {
            if (type.IsInterface || type.IsAbstract)
                yield break;

            yield return bindingRoot.Bind(type).ToProvider(typeof(UIExtensibility.AbstractAddon));
        }
    }

    private class AddonProvider : IProvider<UIExtensibility.AbstractAddon>
    {

        public object Create(IContext context)
        {
            return null;
        }

        public Type Type
        {
            get { throw new NotImplementedException(); }
        }
    }
}

似乎可以避免使用AddonProvider。这从未执行过。

当我表演时: <{1}},kernel.GetAll<UIExtensibility.AbstractAddon>()方法永远不会执行。

你可以告诉我出了什么问题吗? 我很感激你的帮助。

谢谢大家。

3 个答案:

答案 0 :(得分:1)

AddOnProvider继承自IProvider<T>而非UIExtensibility.AbstractAddon

另外,您可能遇到绑定到私有内部类的问题。将AddOnProvider设为公共顶级课程。

答案 1 :(得分:1)

您将从typeof(UIExtensibility.AbstractAddon)继承的特定类型绑定到提供程序。例如,可能有class Foo : UIExtensibility.AbstractAddon。 现在您的约定绑定转换为:

Bind<Foo>().ToProvider<AddonProvider>();

现在,kernel.GetAll<UIExtensibility.AbstractAddon>()正在寻找像:

这样的绑定
Bind<UIExtensibility.AbstractAddon>().To...

修复

所以你需要做的就是改变行

bindingRoot.Bind(type).ToProvider(new AddonProvider());

为:

bindingRoot.Bind(typeof(UIExtensibility.AbstractAddon)).ToProvider<AddonProvider>();

此外

  • 您的行object f = bindingRoot.Bind(type).ToProvider(new AddonProvider());永远不会返回绑定(object f)。
  • UIExtensibility.AbstractAddon实施IProvider

答案 2 :(得分:0)

感谢您的回答和评论。

我认为麻烦在于我并没有弄清楚这个&#34;泛型&#34;绑定过程有效。

我将尝试编写我的大脑步骤流程:

  1. 我需要绑定addons assembly文件夹中的每个AbstractAddon实现。所以,我认为这段代码是对的,但我根本不确定。

    this.Bind(b => b.FromAssembliesMatching("*")
        .SelectAllClasses()
        .InheritedFrom(typeof(UIExtensibility.AbstractAddon))
        .BindWith(new AddonBindingGenerator())
    );
    
  2. 我的AbstractAddon就像:

    public abstract class AbstractAddon : IAddon
    {
    
        private object configuration;
    
        public AbstractAddon(object configuration)
        {
            this.configuration = configuration;
        }
    
        // IAddon interface
    
        public abstract string PluginId { get; }
    
        public abstract string PluginVersion { get; }
    
        public abstract string getCaption(string key);
    
        public abstract Type getConfigurationPanelType();
    
        public abstract System.Windows.Forms.UserControl createConfigurationPanel();
    
    }
    
  3. 我想我需要:

    foreach implementation of `AbstractAddon` found out,
        I need to "inject" a configuration object ->
            So, I guess I need to set a provider and provide this configuration object.
    
  4. 这是我解决这个问题的主要思路。

    我改变了一点我的第一个方法。我没有使用IBindingGenerator类,而是使用了下一个:

        public class AddonsModule : Ninject.Modules.NinjectModule
        {
            public override void Load()
            {
                this.Bind(b => b.FromAssembliesMatching("*")
                    .SelectAllClasses()
                    .InheritedFrom(typeof(UIExtensibility.AbstractAddon))
                    .BindAllBaseClasses()
                    .Configure(c => c.InSingletonScope())
                );
    
                this.Bind<object>().ToProvider<ConfigurationProvider>()
                    .WhenTargetHas<UIExtensibility.ConfigurationAttribute>();
            }
    

    所以,我的ConfigurationProvider是:

    private class ConfigurationProvider : IProvider<object>
    {
    
        public object Create(IContext context)
        {
            return "configuration settings";
        }
    }
    

    现在,我的AbstractAddon构造函数包含使用ConfigurationAttribute注释的参数:

    public AbstractAddon([Configuration]object configuration)
    {
        this.configuration = configuration;
    }
    

    现在的问题是,NInject似乎忽略了配置对象提供程序。 NInject生成转储对象,但不执行ConfigurationProvider.Create方法...

    我现在做错了什么? 这种方法真的比上一种更好吗? 谢谢大家。