如何通过向 MEF 中的导出器传递参数来导入零件?

发布于 2024-10-07 07:36:01 字数 449 浏览 3 评论 0原文

大多数时候我们无条件进口或出口。 我想导入一些配置。像这样的事情:

[Import(typeof(System.Configuration.Configuration))]
private Configuration config
{
    get;
    set;
}

问题是在导出端,我需要传递一个参数才能获得正确的配置。这是导出的函数:

[Export(typeof(System.Configuration.Configuration))]
private Configuration GetConfig(String name)
{
    // Load proper configuration and return it
}

我的问题是如何将参数从导入端传递到导出的函数。请注意,我在导入器的构造函数中使用导出函数(接受参数)。

Most of the time we import an export unconditionally.
I want to import some configurations. something like this:

[Import(typeof(System.Configuration.Configuration))]
private Configuration config
{
    get;
    set;
}

The problem is at export side I need to pass a parameter to get the right configuration. Here is the exported function:

[Export(typeof(System.Configuration.Configuration))]
private Configuration GetConfig(String name)
{
    // Load proper configuration and return it
}

My question is how to pass a parameter from import side, to the exported function. Note that I use exported function (which accept a parameter) inside the constructor of my importer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

香草可樂 2024-10-14 07:36:01

您可以做的是使用 Func 并且 MEF 将为您处理委托。例如:

public class FirstClass
{
  [Export("Method")]
  public string Method(string arg)
  {
    return arg.ToUpperInvariant();
  }
}

public class SecondClass
{
  [Import("Method")]
  public Func<string, string> Func;
}

在该示例中,我正在导出一个命名合约,MEF 将自动确定如何为我连接目标委托。我也可以将 Export 编辑为 Func

因此,在您的情况下,我会将您的 Export 更改为:

[Export("GetConfiguration")]

将您的 Import 和目标属性更改为:

[Import("GetConfiguration")]
public Func<string, Configuration> GetConfig { get; set; }

并且只需使用委托来执行导入的函数。

希望有帮助。

What you can do, is use Func<T, U> and MEF will handle the delegate for you. For instance:

public class FirstClass
{
  [Export("Method")]
  public string Method(string arg)
  {
    return arg.ToUpperInvariant();
  }
}

public class SecondClass
{
  [Import("Method")]
  public Func<string, string> Func;
}

In that example, I'm exporting a named contract and MEF will automatically determine how to wire up the target delegate for me. I could have Exported as Func<string, string> also.

So in your case, I would change your Export to:

[Export("GetConfiguration")]

And your Import and target property to:

[Import("GetConfiguration")]
public Func<string, Configuration> GetConfig { get; set; }

And the simply use the delegate to execute the imported function.

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文