3

我这样做: 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();
4

1 回答 1

6

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

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) { ... }
于 2012-08-24T01:36:55.603 回答