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