C# 从其他部件导入零件

C# 从其他部件导入零件,c#,mef,C#,Mef,方法 我雇用MEF创建一个插件,如果你愿意,应用程序。我的MEF主机有一个ILogger,它公开跟踪消息(字符串消息)。类Logger实现ILogger,并用Export属性修饰,因此Logger看起来像: [Export(typeof (ILogger))] public class Logger : ILogger { } public dynamic ResolveType(string commandType) { try { return this.Contai

方法

我雇用MEF创建一个插件,如果你愿意,应用程序。我的MEF主机有一个
ILogger
,它公开
跟踪消息(字符串消息)
。类
Logger
实现
ILogger
,并用
Export
属性修饰,因此
Logger
看起来像:

[Export(typeof (ILogger))]
public class Logger : ILogger
{ }
public dynamic ResolveType(string commandType)
{
   try
   {
     return this.Container.GetExports<ICommand, ICommandMetaData>()
                .First(contract => contract.Metadata.CommandType.Equals(commandType, StringComparison.OrdinalIgnoreCase))
                .Value;
    }
    catch (Exception e)
    {
       Console.WriteLine(e.message);
    }
}
其想法是,可以为各种插件提供一个中央记录器,供它们写入。因此,实例化将通过
[Import]
属性进行,例如:

[Export(typeof (ILogger))]
public class Logger : ILogger
{
    private readonly IWindsorContainer _container;

    public ICloudTrace CloudTrace
    {
        get { return _container.Resolve<ICloudTrace>(); }
    }

    public Logger()
    {
        _container = new WindsorContainer(new XmlInterpreter());
    }

    public void TraceMessage(string categoryName, string componentName, string message)
    {
        CloudTrace.TraceMessage(categoryName, componentName, message);
    }
}

我应该提到,每个插件都有一个
Execute(Dictionary参数)
,它是插件的入口点,包含此方法的类用
[Export(typeof(ICommand))][ExportMetadata(“CommandType”,“CommandLine命令字符串在这里”)]
属性。

问题出在
组合容器中。目前,它只是加载命令行中指定的插件程序集,而不是进行目录扫描或加载当前正在执行的程序集。这样做的原因多种多样。因此:

var assemblyCatalog = new AssemblyCatalog(Assembly.LoadFrom(assemblyFile: assemblyToLoad));
其中
assemblyToLoad
是特定插件的.dll文件的字符串。但是,记录器位于主机中,因此需要加载主机的程序集。因此:

var assemblyCatalog = new AggregateCatalog(new AssemblyCatalog(Assembly.GetExecutingAssembly()),
                                           new AssemblyCatalog(Assembly.LoadFrom(assemblyFile: assemblyToLoad)));
解决了这个问题。
感谢@Matthew Abbott指出这一点

感谢更新。听起来它既找不到部件,也找不到元数据。您是否有一个示例
命令
和对
ResolveType
的调用。另外,您能确认您能看到容器中的零件吗?我还将使用
FirstOrDefault
而不是
First
来提高容错性,并从方法签名中删除
dynamic
,因为您知道您将返回
ICommand
的实例。啊哈!这是
组合容器
的问题。
AssemblyCatalog
未加载
Logger
程序集!谢谢你的提示