Autofac: Проверете дали екземплярът вече е разрешен

Правя това: https://stackoverflow.com/questions/12069002/autofac-resolve-with-and-without-named-parameter

Регистрирам интерфейс. За инициализацията е необходим параметър. Първото обаждане ще премине този параметър.

На друго място искам да разреша и този екземпляр на интерфейса, но не мога да предам този параметър. Възможно ли е да се провери дали този интерфейс вече е разрешен (в текущия обхват. Използвам ASP.NET WEB API)? Ако го разреша без параметъра, получавам изключение.

Трябва да проверя дали в текущия обхват на 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 задайте bool:

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