尝试在通过配置文件注册的组件上设置OnRelease事件

时间:2014-03-19 21:47:18

标签: wcf autofac

我通过配置文件注册需要特殊处理的组件(即WCF客户端)。

<autofac>
  <components>
    <component 
      type="SomeType" 
      service="ISomeType"/>
  </components>
</autofac>

但是,通过配置文件,我不知道如何指定事件。

我已经看过通过模块实现OnRelease事件,但我似乎无法访问使其工作所需的一些内部信息。主要在:

registration.Activating += (s, e) =>
    {
        var ra = new ReleaseAction(() => ReleaseWcfClient(e.Instance));
        e.Context.Resolve<ILifetimeScope>().Disposer.AddInstanceForDisposal(ra);
    };

在Autofac外部无法使用ReleaseAction课程。

1 个答案:

答案 0 :(得分:2)

Autofac不支持通过XML配置设置事件。你必须在代码中这样做。

但是,您可以通过更交叉的方式执行此操作的一种方法是创建Autofac模块并覆盖AttachToComponentRegistration方法。在那里,您可以测试每个注册的内容(例如它是否是特定接口的注册)并在那里附加您的Activating事件处理程序。

There is an example of using AttachToComponentRegistration on the Autofac wiki显示如何使用此事件连接log4net。

另外两个注释:

  1. 您可能有兴趣为WCF客户端代理使用UseWcfSafeRelease()注册扩展。我不知道你的ReleaseWcfClient()方法在内部做了什么,但如果它的目的是处理来自WCF的可能异常,那么Autofac在UseWcfSafeRelease()中就是这样。 You can read about that on the wiki
  2. 如果组件实现IDisposable(WCF客户端的方式),那么Autofac将自动跟踪它并处理处理。如果您在Autofac执行处置时想要运行某些特定内容,you'd want to use OnRelease for the registration。如果它实现IDisposable并且您想要设置自己的处理解决方案,则需要使用ExternallyOwned()注册该组件,这样您的组件就不会被双重处理。
  3. (我不知道后面这些要点中的任何一个是否适用于此,但我想自从我们来到这个地区以来我一直提高它们。)