Search code examples
c#mef

MEF Instantiate composition only once during application startup


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


Solution

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