Autofac:检查实例是否已解决

时间:2012-08-22 09:33:32

标签: c# asp.net-web-api autofac

我这样做: https://stackoverflow.com/questions/12069002/autofac-resolve-with-and-without-named-parameter

我注册了一个界面。对于初始化,需要参数。 第一个调用将传递此参数。

在另一个地方,我也想解决这个接口的实例,但我不能传递这个参数。 是否可以检查此接口是否已解析(在当前范围内。我使用ASP.NET WEB API)? 如果我在没有参数的情况下解决它,我会得到一个例外。

我需要检查当前的HttpRequest-scope是否已经解析(所以我可以在不传递参数的情况下得到它,因为如果它已经解析,那么注册的creation-delegate将不会被调用两次)

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

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

1 个答案:

答案 0 :(得分:4)

首先,创建一个可以跟踪实例是否已解析的类:

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) { ... }