【问题标题】:How do I tell MEF which type I need for this interface?我如何告诉 MEF 这个接口我需要哪种类型?
【发布时间】:2012-01-25 02:13:10
【问题描述】:

我有以下内容:

public interface IEmailService
    {
        bool SendEmail(MailMessage message);
    }

[Export(typeof(IEmailService))]
    public class SmtpEmailService : IEmailService
    {
}


[Export(typeof(IEmailService))]
    public class AmazonEmailService : IEmailService
    {
}

如何根据某些条件导入特定的?

例如,当我使用服务时,我有这样的事情:

public class MobileService
    {
        [Import] 
        public IEmailService EmailService { get; set; }

有没有办法在配置文件或任何其他地方配置 MEF,以便它自动知道要导入哪个版本的 EmailService

【问题讨论】:

  • 我认为您可以将它们全部放在一个集合中,然后根据您的配置文件选择您需要的一个。编码应该足够简单。
  • 重点是什么? MEF 的目的是支持加载项方案,因此使用者不应指定特定的依赖项...

标签: c# .net inversion-of-control mef


【解决方案1】:

您可以在导出时在Export 属性中指定合同的名称,然后使用您在Import 属性中导出的名称之一,如下所示:

[Export("SmtpEmailService", typeof(IEmailService))]
public class SmtpEmailService : IEmailService {
}

[Export("AmazonEmailService", typeof(IEmailService))]
public class AmazonEmailService : IEmailService {
}

[Import("AmazonEmailService")]
public IEmailService EmailService { get; set; } //Import a specific type

如果您还想使用 ImportMany,请参阅 http://mef.codeplex.com 上的 Exports and Metadata 部分

还有一个类似的SO question 应该可以帮助你。

【讨论】:

  • 谢谢!我想这就是一个答案。我希望有一些无代码配置场景,我会在我的web.config 中说 MEF 应该导入什么。这样我会根据我托管解决方案的位置来切换它。
  • @katit 是的,我相信一些 .config 解决方案确实存在,但目前我没有任何知识和参考资料,你需要多用谷歌搜索一下......谢谢你的接受......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
相关资源
最近更新 更多