在WCF应用程序中初始化MEF DirectoryCatalog的位置?

时间:2011-09-20 14:29:13

标签: wcf mef

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您需要考虑服务的生命周期。单例服务可能没问题,因为DirectoryCatalog只需要创建一次。使用非单例服务时,每次实例化服务时都会创建DirectoryCatalog,这可能有点慢(因为DirectoryCatalog扫描文件夹以尝试加载程序集)。旋转起来CompositionContainer个实例非常便宜。我倾向于做的是提供一个接口抽象:

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附加到服务中。

答案 2 :(得分:0)

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

最后,XML配置看起来像这样:

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

非常简单,易于跨项目重用。无需在您的服务代码中添加组合逻辑,这是我喜欢的。

我有关于此问题的完整文章:https://yoavniran.wordpress.com/2012/10/18/unit-testing-wcf-and-mef-part-2/以及代码示例:https://bitbucket.org/yoavniran/wcf-mef-and-testing-sample-code/src

相关问题