Autofac: вопросы об OnActivating и OnActivation - PullRequest
0 голосов
/ 04 июня 2019

Я только начал изучать использование Autofac и натолкнулся на события Lifetime OnActivating и OnActivated.

Теперь я прочитал документацию по Autofac ЗДЕСЬ

, но возникает вопрос о разнице между ними и их использованием.

Неясные моментыявляются:

  1. В вышеприведенных документах говорится, что OnActivated повышается "после того, как компонент полностью построен".Итак, для меня это означает, что для OnActivating компонент НЕ построен полностью, иначе зачем упоминать его только для этого события.Если в это поверить, то почему вы можете изменить свойства и вызвать методы в экземпляре (через свойство IActivatingEventArgs.Instance), если он еще не готов?

  2. В документах сказано дляOnActivating что он "поднимается до использования компонента".Означает ли «используется» перед тем, как какой-либо метод Resolve передает компонент клиентскому коду?

  3. Возникает ли событие OnActivated ДО того, как компонент «используется»?В документах об этом ничего не сказано, но вы решили упомянуть об этом для события OnActivating.

Кто-нибудь лучше расскажет, когда использовать каждое событие?

1 Ответ

2 голосов
/ 04 июня 2019

Событие OnActivated вызывается, когда весь компонентный граф полностью создается, тогда как событие OnActivating запускается, когда компонент строится.

Предположим, у нас есть этот график

enter image description here

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...