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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
45.1: Partial 클래스 (0) | 2022.07.26 |
---|---|
45: Partial 클래스와 Partial 메소드 (0) | 2022.07.26 |
44.1: C# 과 ASP.NET 에서 Unity 를 통한 Dependency Injection 사용하기 (0) | 2022.07.25 |
43.4: 지연된, 스레드-안전한 Singleton (.NET 3.5 나 이전 버전들을 위한 대체 구현) (0) | 2022.07.25 |
43.3: 스레드-안전한 지연된 Singleton (Double Checked Locking - 이중 검사 잠금 방식) (0) | 2022.07.25 |