C# 如何告诉MEF此接口需要哪种类型?

C# 如何告诉MEF此接口需要哪种类型?,c#,.net,inversion-of-control,mef,C#,.net,Inversion Of Control,Mef,我有以下建议: public interface IEmailService { bool SendEmail(MailMessage message); } [Export(typeof(IEmailService))] public class SmtpEmailService : IEmailService { } [Export(typeof(IEmailService))] public class AmazonEmailS

我有以下建议:

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

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

[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,请参阅上的部分


还有一个类似的方法应该可以帮助你

我认为您可以在一个集合中获取它们,然后根据配置文件选择所需的一个。应该是足够简单的代码。重点是什么?MEF的目的是支持外接程序场景,因此消费者不应该指定特定的依赖项……谢谢!我想这是一个答案。我希望出现一些无代码配置场景,在我的
web.config
中,我会说MEF应该导入什么。通过这种方式,我会根据我托管解决方案的位置进行切换。@katit是的,我相信确实存在一些.config解决方案,但目前我没有关于它的任何知识和参考资料,您需要在谷歌上再搜索一次。谢谢您的接受。。