Autofac:检查实例是否已解决

use*_*899 3 c# autofac asp.net-web-api

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

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

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

我需要检查当前 HttpRequest-scope 中是否已经解析(所以我可以在不传递参数的情况下获取它,因为如果它已经解析,注册的创建委托将不会被调用两次)

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

    }).InstancePerHttpRequest();//.InstancePerApiRequest();
Run Code Online (Sandbox Code Playgroud)

Nic*_*rdt 5

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

public class Tracker
{
    public bool IsResolved { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

(您可能希望稍微修饰一下:))

使用与您要跟踪的任何内容相同的范围注册它:

builder.RegisterType<Tracker>()
    .InstancePerHttpRequest();
Run Code Online (Sandbox Code Playgroud)

然后,在OnActivated事件中,设置布尔值:

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

您也可以在激活期间(在第一个委托中)设置该字段,但OnActivated如果您愿意,使用该事件可以更容易地概括这一点。

最后,检查字段:

if (container.Resolve<Tracker>().IsResolved) { ... }
Run Code Online (Sandbox Code Playgroud)