Autofac: проверьте, разрешен ли уже экземпляр

Я делаю это: разрешить-с-и-без-именованного-параметра

Я регистрирую интерфейс. Для инициализации необходим параметр. Первый вызов будет передавать этот параметр.

В другом месте я тоже хочу разрешить этот экземпляр интерфейса, но не могу передать этот параметр. Можно ли проверить, был ли уже разрешен этот интерфейс (в текущей области. Я использую веб-API ASP.NET)? Если я разрешаю это без параметра, я получаю исключение.

Мне нужно проверить, разрешен ли уже в текущей HttpRequest-области (поэтому я могу получить его без передачи параметра, потому что, если он уже разрешен, зарегистрированный делегат создания не будет вызываться дважды)

m_builder.Register<IMyClass((c, p) =>
    {
        //...
        return new MyClass;

    }).InstancePerHttpRequest();//.InstancePerApiRequest();

person user437899    schedule 22.08.2012    source источник


Ответы (1)


Во-первых, создайте класс, который может отслеживать, разрешен экземпляр или нет:

public class Tracker
{
    public bool IsResolved { get; set; }
}

(Возможно, вы захотите немного украсить это :))

Зарегистрируйте его с той же областью действия, что и все, что вы хотите отслеживать:

builder.RegisterType<Tracker>()
    .InstancePerHttpRequest();

Затем в событии OnActivated установите логическое значение:

builder.Register((c, p) => {
        return new MyClass();
    })
    .As<IMyClass>()
    .InstancePerHttpRequest()
    .OnActivated(e => {
        e.Context.Resolve<Tracker>().IsResolved = true;
    });

Вы также можете установить поле во время активации (в первом делегате), но использование события OnActivated упрощает его обобщение, если вы хотите.

Наконец, чтобы проверить поле:

if (container.Resolve<Tracker>().IsResolved) { ... }
person Nicholas Blumhardt    schedule 24.08.2012