#c# #ninject #inversion-of-control
#c# #ninject #инверсия управления
Вопрос:
Как вы привязываете обработчики событий к зависимостям с помощью Ninject и привязываете их к классу, к которому они прикреплены, чтобы, когда этот класс выходит за рамки, обработчик событий можно было удалить и удалить его зависимость?
Допустим, у меня есть класс с обработчиком событий
class Foo
{
public EventHandler EventHappened;
}
и класс, который будет действовать как уведомитель о событии
class Bar
{
public void Notify(object sender, EventArgs args) { //some work }
}
Как прикрепить Bar к Foo с помощью Ninject, чтобы, если Bar имеет одноразовую зависимость
class Baz : IDisposable
{
void IDisposable.Dispose() { }
}
class Bar
{
Baz baz { get; private set;}
public Bar(Baz baz) { this.baz = baz; }
}
это когда Foo выходит за рамки, База.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?
Заранее благодарю.