我只是在MEF领域迈出了第一步,并希望使用.net core 2.1。
使用VS 2017(版本15.8.8),我已经完成了带有界面的小型控制台应用程序(.NET Core)
interface IMessageSender
{
void Send(string message);
}
和一个实现(在同一项目中)
[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine("EmailSender : " + message);
}
}
最后,我从Main(string [] args)执行了一个小的compose方法
[Import]
private void Compose()
{
var assembly_A = new[] { typeof(Program).GetTypeInfo().Assembly };
var config_A = new ContainerConfiguration().WithAssembly(assembly_A[0]);
var container_A = config_A.CreateContainer();
var msg_A = container_A.GetExport<IMessageSender>();
msg_A.Send("Hello");
}
它按预期工作
但是,如果我在解决方案中添加新的类库并将Send(string)的实现移动到新添加的项目中,则无法进行。
namespace AnotherMefExtensionProjectNamespace
{
[Export(typeof(IMessageSender))]
public class EmailSenderExtended : IMessageSender
{
public void Send(string message)
{
Console.WriteLine("EmailSenderExtended : " + message);
}
}
}
新的撰写方法
[Import]
public IMessageSender MessageSender { get; set; }
private void Compose()
{
var assembly_B = new[] { typeof(EmailSenderExtended).GetTypeInfo().Assembly };
var config_B = new ContainerConfiguration().WithAssembly(assembly_B[0]);
var container_B = config_B.CreateContainer();
var msg_B = container_B.GetExport<IMessageSender>();
msg_B.Send("Hello");
}
我试图比较不同的配置和容器(示例中的_A与_B),但无法理解有什么不同。我什至试图扩展类ContainerConfiguration以便从指定的程序集中加载,只要给定文件包含Main方法,它就可以工作,但是如果我使用“扩展的” .NET Core类库,则失败。
public static ContainerConfiguration WithChosenAssembly(this ContainerConfiguration configuration, string pathAndFile)
{
var context = AssemblyLoadContext.Default.LoadFromAssemblyPath(pathAndFile);
var ass_list = new List<Assembly>() { context };
configuration = configuration.WithAssemblies(ass_list, null);
return configuration;
}
给我的印象是,您通过开发基本实现指定接口的类库来扩展主应用程序。 我目前似乎无法执行此操作,但显然我误解了一些非常基本的内容。
如果有人愿意让我走上正确的道路,或者给我一个替代的想法,以开发.net core的“插件”,我将不胜感激。
国王的问候 马格努斯
答案 0 :(得分:0)
我意识到我的测试设置无法模拟任何现实情况,因此我将自己的问题带给了我。
显然我应该有三个项目。
审阅我的示例并坚持上面显而易见的“设计”,所有这些都完全可以正常工作。 大多数StackOverflow用户可能不会误入歧途,但对于那些这样做的用户,希望以上内容对您有所帮助。 :-)