问题描述
|
我有IMessageSender接口。
using System.ComponentModel.Composition;
public interface IMessageSender
{
void Send(string message);
}
我有两个实现此接口的插件。这是plugin.cs。
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;
[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}
这是plugin2.cs
[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message + \"!!!!\");
}
}
我有这段代码可以通过MEF运行这些插件。
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System.Collections.Generic;
using System;
public class Program
{
[ImportMany]
public IEnumerable<IMessageSender> MessageSender { get; set; }
public static void Main(string[] args)
{
Program p = new Program();
p.Run();
foreach (var message in p.MessageSender) {
message.Send(\"hello,world\");
}
}
public void Run()
{
Compose();
}
private void Compose()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(@\"./\"));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
编译后,我得到了想要的东西。
> mono program.exe
hello,world
hello,world!!!!
我的问题是如何有选择地用尽许多插件。本示例仅获取所有可用的插件来运行所有插件,但是当我只想运行第一个插件或第二个插件时该怎么办?
例如,可以仅按以下方式运行plugin2.dll吗?
public static void Main(string[] args)
{
Program p = new Program();
p.Run();
var message = messageSender.GetPlugin(\"plugin\"); // ???
message.Send(\"hello,world\");
}
解决了
基于该站点以及Matthew Abbott的回答。我可以拿出这个工作代码。
接口代码(interface.cs)
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;
public interface IMessageSender
{
void Send(string message);
}
public interface IMessageSenderMetadata
{
string Name {get; }
string Version {get; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class,AllowMultiple = false)]
public class MessageMetadataAttribute : ExportAttribute,IMessageSenderMetadata
{
public MessageMetadataAttribute( string name,string version)
: base(typeof(IMessageSender))
{
Name = name;
Version = version;
}
public string Name { get; set; }
public string Version { get; set; }
}
插件代码(Plugin.cs ...)
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;
[MessageMetadataAttribute(\"EmailSender1\",\"1.0.0.0\")]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message + \"????\");
}
}
Program.cs
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System.Collections.Generic;
using System;
using System.Linq;
public class Program
{
[ImportMany(typeof(IMessageSender),AllowRecomposition = true)]
public IEnumerable<Lazy<IMessageSender,IMessageSenderMetadata>> Senders { get; set; }
public static void Main(string[] args)
{
Program p = new Program();
p.Run();
var sender1 = p.GetMessageSender(\"EmailSender1\",\"1.0.0.0\");
sender1.Send(\"hello,world\");
sender1 = p.GetMessageSender(\"EmailSender2\",world\");
}
public void Run()
{
Compose();
}
public IMessageSender GetMessageSender(string name,string version)
{
return Senders
.Where(l => l.Metadata.Name.Equals(name) && l.Metadata.Version.Equals(version))
.Select(l => l.Value)
.FirstOrDefault();
}
private void Compose()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(@\"./\"));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)