我正在尝试找出 MEF 的构造函数注入(inject)属性。我不知道如何告诉它加载构造函数的参数。
这是我要加载的属性
[ImportMany(typeof(BUsers))]
public IEnumerable<BUsers> LoadBUsers { get; set; }
这是我用来导入程序集的代码。
try
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog("DI"));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
这是我要加载的类
[Serializable]
[Export(typeof(BUsers))]
public class EditProfile : BUsers
{
[ImportingConstructor]
public EditProfile(string Method, string Version)
{
Version = "2";
Action = "Edit";
TypeName = "EditProfile";
}
最佳答案
当您使用 ImportingConstructor 属性时,构造函数的参数变为导入。默认情况下,您要导入的内容(契约(Contract)名称)基于您要导入的参数或属性的类型。所以在这种情况下,您的两个导入的契约(Contract)类型都是字符串,并且第一个和第二个参数之间没有真正的区别。
看起来您正在尝试使用导入来提供配置值,这不一定是它的设计目的。为了让它做你想做的事,你应该覆盖每个参数的契约(Contract)名称,如下所示:
[ImportingConstructor]
public EditProfile([Import("Method")] string Method, [Import("Version")] string Version)
{ }
然后您需要在容器中导出 Method 和 Version。一种方法是直接添加它们:
var container = new CompositionContainer(catalog);
container.ComposeExportedValue("Method", "MethodValue");
container.ComposeExportedValue("Version", "2.0");
container.ComposeParts(this);
(请注意,ComposeExportedValue 实际上是在静态 AttributedModelServices 类上定义的扩展方法。)
如果您想从某种配置文件中读取这些值,您可以创建自己的导出提供程序,它读取配置并将其中的值作为导出提供给容器。
处理此问题的另一种方法是只导入一个接口(interface),该接口(interface)提供按名称访问配置值的权限,并从构造函数的主体中获取所需的值。
关于c# - MEF构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2008133/