NInject:在约定绑定

时间:2015-07-21 08:50:22

标签: ninject ninject-extensions

总结:

  1. 我在插件文件夹中的几个程序集上未定义未知的IProducerPlugin实现。
  2. 我的Core对象存储了当前注册用户的列表。
  3. Core是Composition Root。
  4. 所以,我需要:

    1. 创建与注册用户数一样多的IProducerPlugin继承的类对象。
    2. 当新用户取消/注册时,我需要创建/释放这些对象。
    3. 为了注册我的"插件":

      this.Kernel.Bind(b => b.FromAssembliesMatching("*")
                  .SelectAllClasses()
                  .InheritedFrom(typeof(Extensibility.IProducerPlugin))
                  .BindAllInterfaces());
      

      我还没弄清楚如何实现这个目标。

      你能帮我吗?

      我很感激你的帮助。

2 个答案:

答案 0 :(得分:1)

一般的DI容器和特殊的Ninject 适合在运行时添加和删除容器的新绑定。有些像Autofac,甚至不允许在创建容器后添加绑定。 Ninject允许随时添加新的绑定,但你不能永远删除它们(*来自某些用例Rebind,但这不一样)。

kernel.Release(object)没有删除绑定,它只删除对它所拥有的object的所有引用。 例如:

var foo = new object();
kernel.Bind<object>().ToConstant(foo);

允许foo垃圾收集,您可以执行以下操作之一:

  • kernel.Release(foo);
  • kernel.Dispose(); kernel = null;

这正是kernel.Release(...)的用途。也许你也可以Release一个单身人士,从而迫使ninject在下一个请求中创建一个新单身。但我不知道这是否真的有效,如果确实如此,那肯定是一个意想不到的黑客攻击。

所以你应该做的是自己管理列表/字典。您可以使用ninject绑定并注入列表/词典/管理器你称之为的内容,但是你不能让ninject manager成为列表本身。

答案 1 :(得分:0)

我使用这个IBindingGenerator接口方法设法做了类似的事情......

我使用了.BindWith<>()绑定方法......

this.Kernel.Bind(b => b.FromAssembliesMatching("*")
            .SelectAllClasses()
            .InheritedFrom(typeof(Extensibility.IProducerPlugin))
            .BindWith<PluginBindingGenerator<Extensibility.IProducerPlugin>>()
        );

我已经实现了IBindingGenerator:

public class PluginBindingGenerator<T> : IBindingGenerator
{
    public System.Collections.Generic.IEnumerable<Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, Ninject.Syntax.IBindingRoot bindingRoot)
    {
        if (type != null && !type.IsAbstract && type.IsClass && typeof(T).IsAssignableFrom(type))
        {
            Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax<object> syntax = bindingRoot.Bind(typeof(Extensibility.IProducerPlugin)).ToProvider(new PluginProvider());
            yield return (Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax<object>)syntax;
        }
    }
}

public class PluginProvider : IProvider<object>
{

    private System.Collections.Generic.Dictionary<Domain.Identity.ClientIdentity, Extensibility.IProducerPlugin> plugins;

然后,提供者:

    public PluginProvider()
    {
        this.plugins = new System.Collections.Generic.Dictionary<Domain.Identity.ClientIdentity, Extensibility.IProducerPlugin>();
    }

    public object Create(IContext ctx)
    {

        //... I don't know what to do here...

        return objects;
    }

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