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

Wcf 试图在通过配置文件注册的组件上设置OnRelease事件,wcf,autofac,Wcf,Autofac,我正在通过配置文件注册需要在发布时进行特殊处理的组件(即WCF客户端) <autofac> <components> <component type="SomeType" service="ISomeType"/> </components> </autofac> 但是,通过配置文件,我不知道如何指定事件 我已经研究过通过模块实现OnRelease事件,但我似乎无法访问使其工作所需的一些

我正在通过配置文件注册需要在发布时进行特殊处理的组件(即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);
    };
registration.Activating+=(s,e)=>
{
var ra=newreleaseaction(()=>ReleaseWcfClient(e.Instance));
e、 Context.Resolve().Disposer.AddInstanceForDisposal(ra);
};

在Autofac之外,
ReleaseAction
类不可用。

Autofac不支持通过XML配置设置事件。您必须在代码中执行此操作

但是,一种更具交叉性的方法是创建Autofac模块并覆盖
AttachToComponentRegistration
方法。在那里,您可以测试每个注册的内容(比如它是否是特定接口的注册),并将
激活事件处理程序附加到那里

显示如何使用此事件连接log4net

其他两项说明:

  • 您可能有兴趣为WCF客户端代理使用
    UseWcfSafeRelease()
    注册扩展。我不知道您的
    ReleaseWcfClient()
    方法在内部做什么,但如果它的目的是处理来自WCF的可能异常,Autofac在
    UseWcfSafeRelease()
    中有这一点
  • 如果组件实现了IDisposable
  • (WCF客户端的方式),则Autofac将自动跟踪它并处理处置。如果要在Autofac执行处置时运行某些特定的操作。如果它实现了
    IDisposable
    ,并且您想要设置自己的处置解决方案,那么您需要使用
    ExternallyOwned()
    注册组件,这样您的组件就不会被双重处置
    (我不知道后几点是否适用于这里,但我想我会提出它们,因为我们在该地区。)

    我最终使用一个模块将OnRelease代码添加到实现ICommunicationObject的任何东西中。
    ReleaseWcfClient
    UseWcfSafeRelease
    代码几乎相同,但在与我们的客户合作时略有不同。