Проблема оформления контрактов MEF - PullRequest
1 голос
/ 08 марта 2011

У меня есть этот класс:

public interface IHandles<DOMAINEVENT> where DOMAINEVENT : IDomainEvent
{
    void Handle(DOMAINEVENT args);
}

[Export(typeof(IHandles<IDomainEvent>))]
public class NewMemberWasRegisteredHandler : IHandles<NewMemberWasRegistered>
{
    public void Handle(NewMemberWasRegistered args)
    {
        //EmailSender.Send
        Console.WriteLine("***New Member Registration Email Sent");
    }
}

, который я пытаюсь экспортировать в:

открытый класс HandlerContainer {public HandlerContainer () {Handlers = new List> ();}

    [ImportMany()]
    public List<IHandles<IDomainEvent>> Handlers { get; set; }
}

Исключение, которое я получаю:

1) Экспорт 'Multi_Tenant_MEF_Solution.NewMemberWasRegisteredHandler (ContractName = "Multi_Tenant_MEF_Solution.IHandles (Multi_Tenant_MEF_Solution.") notmain not not not)набрать 'Multi_Tenant_MEF_Solution.IHandles`1 [[Multi_Tenant_MEF_Solution.IDomainEvent, Multi-Tenant-MEF-Solution, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]]'.

Я MEFnewb (2 часа), так что это сбивает с толку меня.Все примеры, которые я могу найти, используют конструкторы без параметров Import и Export, поэтому я не знаю, какими должны быть мои typeof () или строковые контракты.

1 Ответ

2 голосов
/ 08 марта 2011

Проблема в NewMemberWasRegisteredHandler не может быть преобразована в IHandles<IDomainEvent>.Используя MEF и переопределяя экспортируемый контракт, вы получаете ошибку времени выполнения, где без MEF вы бы получили ошибку времени компиляции.Вот как бы это выглядело без MEF:

public interface IDomainEvent { }

public class NewMemberWasRegistered : IDomainEvent { }

public interface IHandles<DOMAINEVENT> where DOMAINEVENT : IDomainEvent
{
    void Handle(DOMAINEVENT args);
}

public class NewMemberWasRegisteredHandler : IHandles<NewMemberWasRegistered>
{
    public void Handle(NewMemberWasRegistered args) { }
}

public class HandlerContainer
{
    public List<IHandles<IDomainEvent>> Handlers { get; set; }

    public HandlerContainer()
    {
        Handlers = new List<IHandles<IDomainEvent>>();

        Handlers.Add(new NewMemberWasRegisteredHandler());
    }

}

Вы получаете ошибку компиляции, которую вы не можете преобразовать NewMemberWasRegisteredHandler в IHandles<IDomainEvent>.Это связано с тем, что DOMAINEVENT не является ковариантным в интерфейсе IHandles.Вы можете сделать его ковариантным, добавив ключевое слово out, но тогда ваш метод Handle будет недопустимым.

...