Section 44.2: MEF 를 이용한 Dependency injection

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) { // 메시지를 파일에 기록한다 } } 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() { // 복수개의 catalog 를 결합한 catalog 의 집합이다 var catalog = new AggregateCatalog(); string loggersDllDirectory = Path.Combine(Utilities.GetApplicationDirectory(), "Loggers"); if (!Directory.Exists(loggersDllDirectory)) { Directory.CreateDirectory(loggersDllDirectory); } // PluginManager 와 동일한 어셈블리 내에서 발견된 모든 part 들을 추가한다 catalog.Catalogs.Add(new AssemblyCatalog(typeof (Program).Assembly)); catalog.Catalogs.Add(new DirectoryCatalog(loggersDllDirectory)); // catalog 내의 part 들로 이루어진 CompositionContainer 를 생성한다 _container = new CompositionContainer(catalog); // 이 객체의 import 에 해당하는 부분을 채워넣는다 try { this._container.ComposeParts(this); } catch (CompositionException compositionException) { throw new CompositionException(compositionException.Message); } } }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts