如何使用实例实现 System.Composition MEF ImportingConstructor
How to fulfill System.Composition MEF ImportingConstructor with an instance
我正在使用 MEF(来自 nuget 的 System.Composition)+ Common.Logging 并且有 类 调用 ILog,例如,
[Export(typeof(ITranslator))]
public class ATranslator : BaseTranslator
{
[ImportingConstructor]
public ATranslator(ILog log)
{
...
}
记录器实例可通过 log = LogManager.GetLogger<ITranslator>();
从 Common.Logging 获得,但如何将其插入到我的组合容器中?
var container = new ContainerConfiguration()
.WithAssembly(typeof(ITranslator).Assembly)
.CreateContainer();
container.SatisfyImports(this);
这样我就可以
[ImportMany]
private IEnumerable<ITranslator> Translators { get; set; }
没有
System.Composition.Hosting.CompositionFailedException : No export was
found for the contract 'ILog' -> required by import 'log' of part
'ATranslator' -> required by import 'item' of part 'ITranslator[]'
-> required by initial request for contract 'IEnumerable { IsImportMany = True }'
也许您可以尝试在其他 class 中以 属性 的形式导出到 ILog?
public class LogExporter
{
[Export(typeof(ILog))]
public ILog Log
{
return LogManager.GetLogger<ITranslator>();
}
}
或者您可以尝试使用 ComposeExportedValue Method 和代码而不是属性来做到这一点:
container.ComposeExportedValue<ILog>(LogManager.GetLogger<ITranslator>());
我正在使用 MEF(来自 nuget 的 System.Composition)+ Common.Logging 并且有 类 调用 ILog,例如,
[Export(typeof(ITranslator))]
public class ATranslator : BaseTranslator
{
[ImportingConstructor]
public ATranslator(ILog log)
{
...
}
记录器实例可通过 log = LogManager.GetLogger<ITranslator>();
从 Common.Logging 获得,但如何将其插入到我的组合容器中?
var container = new ContainerConfiguration()
.WithAssembly(typeof(ITranslator).Assembly)
.CreateContainer();
container.SatisfyImports(this);
这样我就可以
[ImportMany]
private IEnumerable<ITranslator> Translators { get; set; }
没有
System.Composition.Hosting.CompositionFailedException : No export was found for the contract 'ILog' -> required by import 'log' of part 'ATranslator' -> required by import 'item' of part 'ITranslator[]' -> required by initial request for contract 'IEnumerable { IsImportMany = True }'
也许您可以尝试在其他 class 中以 属性 的形式导出到 ILog?
public class LogExporter
{
[Export(typeof(ILog))]
public ILog Log
{
return LogManager.GetLogger<ITranslator>();
}
}
或者您可以尝试使用 ComposeExportedValue Method 和代码而不是属性来做到这一点:
container.ComposeExportedValue<ILog>(LogManager.GetLogger<ITranslator>());