Как мне сказать MEF, какой тип мне нужен для этого интерфейса? - PullRequest
2 голосов
/ 25 января 2012

У меня есть следующее:

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 импортировать?

1 Ответ

3 голосов
/ 25 января 2012

Вы можете указать имя контракта в атрибуте 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

Существует также аналогичный ТАК вопрос , который должен вам помочь.

...