gpt4 book ai didi

c# - MEF 2 : import many

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:02 25 4
gpt4 key购买 nike

我使用无属性方法来配置 MEF。
我阅读了以下文章:
http://msdn.microsoft.com/en-us/magazine/jj133818.aspx
http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/12/mef-2-0-mini-series-part-4-fluent-import.aspx

测试代码(控制台应用程序项目,.NET 4.5):

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Registration;
using System.Linq;

namespace MEF2
{
public interface IPlugin
{
void Run();
}

public interface IPluginMetadata
{
string Name { get; }
string Version { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class PluginMetadataAttribute : ExportAttribute, IPluginMetadata
{
public string Name { get; set; }
public string Version { get; set; }

public PluginMetadataAttribute(string name, string version)
: base(typeof(IPlugin))
{
Name = name;
Version = version;
}
}

[PluginMetadata("Plugin1", "1.0.0.0")]
public class Plugin1 : IPlugin
{
public void Run()
{
Console.WriteLine("Plugin1 runed");
}
}

[PluginMetadata("Plugin2", "2.0.0.0")]
public class Plugin2 : IPlugin
{
public void Run()
{
Console.WriteLine("Plugin2 runed");
}
}


class Program
{
CompositionContainer container;
IEnumerable<Lazy<IPlugin, IPluginMetadata>> plugins = Enumerable.Empty<Lazy<IPlugin, IPluginMetadata>>();

static void Main(string[] args)
{
var program = new Program();

foreach (var plugn in program.plugins) {
Console.WriteLine("{0}, {1}", plugn.Metadata.Name, plugn.Metadata.Version);
plugn.Value.Run();
}
}

Program()
{
var builder = new RegistrationBuilder();
builder
.ForTypesDerivedFrom<IPlugin>()
.Export<IPlugin>();
builder
.ForType<Program>()
.Export()
.ImportProperties<IPlugin>(
propertyFilter => true,
(propertyInfo, importBuilder) => {
importBuilder.AsMany();
}
);

var catalog = new AggregateCatalog(
new AssemblyCatalog(typeof(Program).Assembly, builder)
);

container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
}

导出工作正常。
但是当我尝试导入很多时它不起作用。
请帮我解决这个问题。

最佳答案

这不是无属性(命令式)方法,因为导出是有属性的(声明式)。您的自定义元数据属性源自 ExportAttribute .

要使此代码正常工作,您需要执行以下操作:

  • 从构造函数代码中删除命令式导出。
  • 将注册生成器传递给 AssemblyCatalog .没有这个,注册生成器就无法使用。
  • 使用 Lazy<IPlugin, IPluginMetadata> 更新基于约定的导入因为这是要导出的内容。
  • 将调用替换为 ComposePartsGetExports .

更新后的构造函数代码为:

            var builder = new RegistrationBuilder();

builder
.ForType<Program>()
.Export()
.ImportProperties<Lazy<IPlugin, IPluginMetadata>>(
propertyFilter => true,
(propertyInfo, importBuilder) =>
{
importBuilder.AsMany();
}
);

var catalog = new AggregateCatalog(
new AssemblyCatalog(typeof(Program).Assembly, builder)
);

container = new CompositionContainer(catalog);
//container.ComposeParts(this);
plugins = container.GetExports<IPlugin, IPluginMetadata>();

我不确定如何使用 ComposeParts 进行这项工作然而。我会看看它。此外,自定义元数据不必派生自 ExportAttribute .它可以派生自 System.Attribute .这也将使您具有命令式导出。

关于c# - MEF 2 : import many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14376146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com