在WCF应用程序中的何处初始化MEF DirectoryCatalog?

在WCF应用程序中的何处初始化MEF DirectoryCatalog?,wcf,mef,Wcf,Mef,那么,在一个WCF应用程序中,是否有一个神奇的应用程序\u Start或类似的东西,我可以从一个程序集目录组成MEF容器 谢谢 实现服务的构造函数,如果服务被激活,它将被调用。请注意,如果您在IIS中托管,这不是在应用程序池启动时,而是在向服务提交第一个调用时。实现服务的构造函数,如果您的服务被激活,它将被调用。请注意,如果您在IIS中托管,这不是当应用程序池启动时,而是当第一个调用提交给服务时。您需要考虑服务的生存期。单例服务可能很好,因为只需要创建一次DirectoryCatalog。对于非

那么,在一个WCF应用程序中,是否有一个神奇的应用程序\u Start或类似的东西,我可以从一个程序集目录组成MEF容器


谢谢

实现服务的构造函数,如果服务被激活,它将被调用。请注意,如果您在IIS中托管,这不是在应用程序池启动时,而是在向服务提交第一个调用时。

实现服务的构造函数,如果您的服务被激活,它将被调用。请注意,如果您在IIS中托管,这不是当应用程序池启动时,而是当第一个调用提交给服务时。

您需要考虑服务的生存期。单例服务可能很好,因为只需要创建一次

DirectoryCatalog
。对于非单例服务,每次实例化服务时都会创建
DirectoryCatalog
,这可能有点慢(因为
DirectoryCatalog
扫描文件夹以尝试加载程序集)<代码>合成容器实例的启动成本非常低。我倾向于提供一个接口抽象:

public interface ICompositionContainerFactory
{
  CompositionContainer CreateCompositionContainer();
}
我会把它连接起来:

public static class CompositionContainerBuilder
{
  private static readonly CompositionContainer _container;

  static CompositionContainerBuilder()
  {
    var factory = CreateCompositionContainerFactory();
    _container = factory.CreateCompositionContainer();
  }

  public static CompositionContainer Container { get { return _container; } }

  private static ICompositionContainerFactory CreateCompositionContainerFactory()
  {
    Type factoryType = // Get from somewhere - configuration perhaps?
    return (ICompositionContainerFactory)Activator.CreateInstance(factoryType);
  }
}

如果您很高兴只需要创建一次容器,那么可以使用此方法。您将构建
ICompositionContainerFactory
的实例,然后对其进行配置。容器通过静态构造函数构建一次(并且仅构建一次)。然后可以使用
CompositionContainerBuilder.Container
获取容器。接下来,只需通过<代码> IInstanceProvider < /代码>将您的MEF容器连接起来,并将其附加到服务中,作为<代码> IServiceBehavior < /代码>。

< P>您需要考虑服务的生存期。单例服务可能很好,因为只需要创建一次
DirectoryCatalog
。对于非单例服务,每次实例化服务时都会创建
DirectoryCatalog
,这可能有点慢(因为
DirectoryCatalog
扫描文件夹以尝试加载程序集)<代码>合成容器实例的启动成本非常低。我倾向于提供一个接口抽象:

public interface ICompositionContainerFactory
{
  CompositionContainer CreateCompositionContainer();
}
我会把它连接起来:

public static class CompositionContainerBuilder
{
  private static readonly CompositionContainer _container;

  static CompositionContainerBuilder()
  {
    var factory = CreateCompositionContainerFactory();
    _container = factory.CreateCompositionContainer();
  }

  public static CompositionContainer Container { get { return _container; } }

  private static ICompositionContainerFactory CreateCompositionContainerFactory()
  {
    Type factoryType = // Get from somewhere - configuration perhaps?
    return (ICompositionContainerFactory)Activator.CreateInstance(factoryType);
  }
}

如果您很高兴只需要创建一次容器,那么可以使用此方法。您将构建
ICompositionContainerFactory
的实例,然后对其进行配置。容器通过静态构造函数构建一次(并且仅构建一次)。然后可以使用
CompositionContainerBuilder.Container
获取容器。接下来,只需通过
IInstanceProvider
连接MEF容器,并将其作为
IServiceBehavior
附加到服务上,我通过创建自己的InstanceProvider(实现IInstanceProvider)解决了这个问题。我创建了一个端点行为扩展,它允许我为组合配置所需的程序集。 我使用了汇编目录,但其原理是相同的

最后,XML配置如下所示:

 <endpointBehaviors>
    <behavior name="jsonBehavior">
      <enableWebScript/>
  <endpointComposed>
    <assemblies>
        <add name="sampleApplication" value="SampleApplication"/>
    </assemblies>
      </endpointComposed>
    </behavior>                
  </endpointBehaviors>


上的代码示例:

我通过创建自己的InstanceProvider(实现IInstanceProvider)解决了这个问题。我创建了一个端点行为扩展,它允许我为组合配置所需的程序集。 我使用了汇编目录,但其原理是相同的

最后,XML配置如下所示:

 <endpointBehaviors>
    <behavior name="jsonBehavior">
      <enableWebScript/>
  <endpointComposed>
    <assemblies>
        <add name="sampleApplication" value="SampleApplication"/>
    </assemblies>
      </endpointComposed>
    </behavior>                
  </endpointBehaviors>


以及上的代码示例:

如果我需要导入一个类,该类是我用来在编写之前解析扩展目录路径的类,该怎么办?我想我不完全理解您的评论,是否要导入类以使用MEF解析路径?是否有方法使用app.config设置中的值使容器从目录自行组合?只是想知道。当然,使用DirectoryCatalog,它接受指向程序集所在路径的字符串,将其添加到CompositionContainer并获取您的类。如果我需要导入一个类,该类是我在编写之前解析扩展目录路径所用的类,该怎么办?我想我不完全理解您的评论,是否要导入类以使用MEF解析路径?是否有方法使用app.config设置中的值使容器从目录自行组合?只是想知道。当然,使用DirectoryCatalog接受指向程序集所在路径的字符串,将其添加到CompositionContainer并获取类