【问题标题】:Autofac: Check if instance is already resolvedAutofac:检查实例是否已经解析
【发布时间】:2012-08-22 09:33:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多