We can instantiate MEF composition using following code:
private void Compose()
{
DirectoryCatalog catalog = new DirectoryCatalog(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), "*.dll");
CompositionContainer container = new CompositionContainer(catalog);
container.SatisfyImportsOnce(this);
}
This works absolutely fine. But need to be instantiated in the constructor of each class wanting composition.
How can I instantiate the same only once when the web application loads and it works fine for all imports within the entire web application.
Thanks
You can write a static helper class that will encapsulate your container and will lazily initialize it on first-time use, and return already instantiated container on following uses. Something like this:
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; }
}
}
and it's usage will look like simply
CompositionUtil.Container.SatisfyImports(this);