我已创建此代码:
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>()
方法永远不会执行。
谢谢大家。
答案 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;绑定过程有效。
我将尝试编写我的大脑步骤流程:
我需要绑定addons assembly文件夹中的每个AbstractAddon
实现。所以,我认为这段代码是对的,但我根本不确定。
this.Bind(b => b.FromAssembliesMatching("*")
.SelectAllClasses()
.InheritedFrom(typeof(UIExtensibility.AbstractAddon))
.BindWith(new AddonBindingGenerator())
);
我的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();
}
我想我需要:
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.
这是我解决这个问题的主要思路。
我改变了一点我的第一个方法。我没有使用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
方法...
我现在做错了什么? 这种方法真的比上一种更好吗? 谢谢大家。