MEF 构造函数注入 [英] MEF Constructor Injection

查看:41
本文介绍了MEF 构造函数注入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试找出 MEF 的构造函数注入属性.我不知道如何告诉它加载构造函数的参数.

I'm trying to figure out MEF's Constructor Injection attribute. I have no idea how I tell it to load the constructor's parameters.

这是我要加载的属性

[ImportMany(typeof(BUsers))]
public IEnumerable<BUsers> LoadBUsers { get; set; }

这是我用来导入程序集的代码.

Here is the code I'm using to import the assemblies.

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 属性时,构造函数的参数变为导入.默认情况下,您要导入的内容(合同名称)基于您要导入的参数或属性的类型.因此,在这种情况下,您的两个导入的合同类型都是字符串,第一个和第二个参数之间没有真正的区别.

When you use the ImportingConstructor attribute, the parameters to the constructor become imports. By default, what you are importing (the contract name) is based on the type of the parameter or property that your are importing into. So in this case the contract type for both your imports is string, and there's no real difference between the first and second parameter.

看起来您正在尝试使用导入来提供配置值,这不一定是它的设计目的.为了让它做你想做的事,你应该覆盖每个参数的合同名称,像这样:

It looks like you are trying to use imports to supply configuration values, which isn't necessarily what it was designed for. To get it to do what you want, you should override the contract name for each of the parameters, like this:

[ImportingConstructor]
public EditProfile([Import("Method")] string Method, [Import("Version")] string Version)
{ }

然后您需要导出容器中的方法和版本.一种方法是直接添加它们:

Then you need exports for Method and Version in your container. One way to do this is just to add them directly:

var container = new CompositionContainer(catalog);
container.ComposeExportedValue("Method", "MethodValue");
container.ComposeExportedValue("Version", "2.0");
container.ComposeParts(this);

(注意 ComposeExportedValue 实际上是定义在静态 AttributedModelServices 类上的扩展方法.)

(Note that ComposeExportedValue is actually an extension method defined on the static AttributedModelServices class.)

如果您想从某种配置文件中读取这些值,您可以创建自己的导出提供程序,该提供程序读取配置并将其中的值作为导出到容器提供.

If you want to read these values from a configuration file of some sort, you could create your own export provider which reads the configuration and provides the values in it as exports to the container.

另一种处理方法是只导入一个接口,该接口提供按名称访问配置值的权限,并从构造函数的主体中获取您需要的值.

An alternative way to handle this would be to just import an interface that provides access to the configuration values by name, and get the values you need from the body of the constructor.

这篇关于MEF 构造函数注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆