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

MEF Instantiate composition only once during application startup

我们可以使用以下代码实例化 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);
}

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

如何在 Web 应用程序加载时仅实例化一次,并且它对整个 Web 应用程序中的所有导入工作正常。

谢谢

您可以编写一个静态帮助程序 class 来封装您的容器并在首次使用时延迟初始化它,并且 return 在后续使用时已经实例化了容器。像这样:

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);