MEF仅在应用程序启动期间实例化组合

时间:2016-01-26 17:23:12

标签: c# mef

我们可以使用以下代码实例化MEF组合:

private void Compose()
{
    DirectoryCatalog catalog = new DirectoryCatalog(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), "*.dll");
    CompositionContainer container = new CompositionContainer(catalog);
    container.SatisfyImportsOnce(this);
}

这绝对没问题。 但需要在每个想要合成的类的构造函数中实例化。

如何在加载Web应用程序时仅对其进行一次实例化,并且适用于整个Web应用程序中的所有导入。

由于

1 个答案:

答案 0 :(得分:1)

您可以编写一个静态帮助程序类来封装容器,并在首次使用时懒惰地初始化它,并在以后使用时返回已经实例化的容器。像这样:

public static class CompositionUtil
{
    private static readonly Lazy<CompositionContainer> _container = new Lazy<CompositionContainer>(InitContainer);

    private static CompositionContainer InitContainer()
    {
        DirectoryCatalog catalog = new DirectoryCatalog(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), "*.dll");
        return new CompositionContainer(catalog);
    }

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

它的用法看起来就像

CompositionUtil.Container.SatisfyImports(this);