如何使用Ninject绑定事件处理程序

时间:2016-10-13 20:23:56

标签: c# ninject inversion-of-control

如何使用Ninject将事件处理程序与依赖项绑定,并将它们范围限定为它们所附加的类,以便当该类超出范围时,可以删除事件处理程序并处理它的依赖性?

假设我有一个带有事件处理程序的类

class Foo
{
    public EventHandler EventHappened;
}

和一个将充当事件通知者的类

class Bar
{
    public void Notify(object sender, EventArgs args) { //some work }
}

如何使用Ninject将Bar附加到Foo,以便Bar可以使用一次性依赖

class Baz : IDisposable
{
    void IDisposable.Dispose() { }
}

class Bar
{
    Baz baz { get; private set;}

    public Bar(Baz baz) { this.baz = baz; }
}

当Foo超出范围时,也会调用Baz.Dispose()吗?

我绑定了所有类似的东西

Bar notifier = null;
Bind<Baz>().ToSelf().WhenInjectedInto<Bar>().InParentScope();   
Bind<Bar>().ToSelf().InParentScope(); 
Bind<Foo>()
    .ToSelf()
    .InSomeScope()
    .OnActivation((context, instance) =>
    {
         notifier = context.Kernel.Get<Bar>();
         instance.EventHappened += notifier.Notify;
    })
    .OnDeactivation((context, instance) =>
    {
         instance.EventHappened -= notifier.Notify;
         context.Kernel.Release(notifier);
    });

但我不认为包含Bar的变量的范围与其他变量一样,并没有真正被处理掉。同样以这种方式绑定它,没有明确的方法告诉下一个程序员事件处理程序需要以这种方式作用域,否则它不会被处理掉,而是围绕它发表一篇小说的评论。使用Ninject是否有更好的方法在此配置中绑定类?

提前致谢。

0 个答案:

没有答案