C# Autofac:检查实例是否已解析

C# Autofac:检查实例是否已解析,c#,asp.net-web-api,autofac,C#,Asp.net Web Api,Autofac,我这样做: 我注册了一个接口。对于初始化,需要一个参数。 第一次调用将传递此参数 在另一个地方,我也想解析接口的这个实例,但我不能传递这个参数。 是否可以检查此接口是否已解析(在当前范围内。我使用ASP.NET WEB API)? 如果我在没有参数的情况下解析它,我会得到一个异常 我需要检查当前HttpRequest范围中是否已经解析了(这样我就可以在不传递参数的情况下获得它,因为如果已经解析了,那么注册的创建委托将不会被调用两次) m_builder.Register { //... 返回新

我这样做:

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

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

我需要检查当前HttpRequest范围中是否已经解析了(这样我就可以在不传递参数的情况下获得它,因为如果已经解析了,那么注册的创建委托将不会被调用两次)

m_builder.Register
{
//...
返回新的MyClass;
}).InstancePerhtPrequest();/。InstancePerApiRequest();

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

public class Tracker
{
    public bool IsResolved { get; set; }
}
(你可能希望把它修饰一下:))

将其注册到与要跟踪的内容相同的范围:

builder.RegisterType<Tracker>()
    .InstancePerHttpRequest();
您也可以在激活期间(在第一个委托中)设置该字段,但如果您愿意,使用激活的
OnActivated
事件可以更容易地进行概括

最后,要检查字段:

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