Событие OnActivated
вызывается, когда весь компонентный граф полностью создается, тогда как событие OnActivating
запускается, когда компонент строится.
Предположим, у нас есть этот график
class Parent
{
public Parent(Child1 child1, Child2 child2, Child3 child3) { }
}
class Child1
{ }
class Child2
{
public Child2() { }
}
class Child3
{
public Child3(Child2 child2) { }
}
Порядок событий будет следующим:
Parent.preparing
Child1.preparing
Child1.activating
Child2.preparing
Child2.activating
Child3.preparing
Child2.preparing
Child2.activating
Child3.activating
Parent.activating
Child1.activated
Child2.activated
Child2.activated
Child3.activated
Parent.activated
Parent.release
Child3.release
Child2.release
Child2.release
Child1.release
Вот код для отслеживания этих событий:
public static class RegistrationExtensions
{
public static IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle>
Trace<TLimit, TActivatorData, TRegistrationStyle>(this IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> registration)
{
return registration.OnPreparing(e => { Console.WriteLine($"{e.Component.Activator.LimitType.Name}.preparing"); })
.OnActivating(e => { Console.WriteLine($"{e.Component.Activator.LimitType.Name}.activating"); })
.OnActivated(e => { Console.WriteLine($"{e.Component.Activator.LimitType.Name}.activated"); })
.OnRelease(e => { Console.WriteLine($"{e.GetType().Name}.release"); }); ;
}
}
Событие preparing
наступает до создания экземпляра.Вы можете предоставить новый параметр для процесса активации.Событие activating
позволяет изменить экземпляр с помощью метода ReplaceInstance
.Это полезно, если вы хотите издеваться или перехватывать объект.Событие activated
действительно необычно, и вы почти никогда не будете его использовать.Событие release
наступает при удалении связанной области действия
В вашем случае, если вы хотите вызвать метод для инициализации вашего объекта, вам следует использовать событие activating
.