Dependency injection using MEF

suggest change
public interface ILogger
  {
      void Log(string message);
  }

  [Export(typeof(ILogger))]
  [ExportMetadata("Name", "Console")]  
  public class ConsoleLogger:ILogger
  {
      public void Log(string message)
      {
          Console.WriteLine(message);
      }
  }

  [Export(typeof(ILogger))]
  [ExportMetadata("Name", "File")]  
  public class FileLogger:ILogger
  {
      public void Log(string message)
      {
          //Write the message to file
      }
  }

  public class User
  {  
      private readonly ILogger logger;
      public User(ILogger logger)   
      {
          this.logger = logger;
      }
      public void LogUser(string message)
      {
          logger.Log(message)  ;
      }
  }

  public interface ILoggerMetaData
  {
      string Name { get; }
  }
  
  internal class Program
  {
      private CompositionContainer _container;
      
      [ImportMany]
      private IEnumerable<Lazy<ILogger, ILoggerMetaData>> _loggers;
      
      private static void Main()
      {            
          ComposeLoggers();
          Lazy<ILogger, ILoggerMetaData> loggerNameAndLoggerMapping = _ loggers.First((n) => ((n.Metadata.Name.ToUpper() =="Console"));
          ILogger logger= loggerNameAndLoggerMapping.Value
          var user = new User(logger);
          user.LogUser("user name");
      }
      
      private void ComposeLoggers()
      {
          //An aggregate catalog that combines multiple catalogs
          var catalog = new AggregateCatalog();
          string loggersDllDirectory =Path.Combine(Utilities.GetApplicationDirectory(), "Loggers");
          if (!Directory.Exists(loggersDllDirectory ))
          {
              Directory.CreateDirectory(loggersDllDirectory );
          }
          //Adds all the parts found in the same assembly as the PluginManager class
          catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
          catalog.Catalogs.Add(new DirectoryCatalog(loggersDllDirectory ));
          
          //Create the CompositionContainer with the parts in the catalog
          _container = new CompositionContainer(catalog);
          
          //Fill the imports of this object
          try
          {
              this._container.ComposeParts(this);
          }
          catch (CompositionException compositionException)
          {
              throw new CompositionException(compositionException.Message);
          }
      } 
  }

Feedback about page:

Feedback:
Optional: your email if you want me to get back to you:



Table Of Contents