2

Я пытаюсь добавить зависимость к свойству класса с помощью Unity Configuration, а также типы, которые я пытаюсь ввести, являются общими.Как отображать общие типы с единством?

У меня есть интерфейс

public interface ISendMessage 
{ 
    void Send(string contact, string message); 
} 

класс

public class EmailService : ISendMessage 
{ 
    public void Send(string contact, string message) 
    { 
     // do 
    } 
} 

класс

public class MessageService<T> where T : ISendMessage 
{   
} 

Я пытаюсь использовать его с помощью инъекции конструктора в другом классе

public MyService(MessageService<ISendMessage> messageService) 
{ 
} 

Как вводить MessageService<EmailService> вместо MessageService<ISendMessage>?

Я пытаюсь сделать это с помощью app.config

<alias alias="MessageService'1" type="MyNamespace.MessageService'1, MyAssembly" /> 
    <alias alias="EmailMessageService'1" type="MyNamespace.MessageService'1[[MyNamespace.EmailService, MyAssembly]], MyAssembly" /> 

Я получаю ошибку

Имя типа или псевдоним MessageService'1 не может быть решена. Пожалуйста, проверьте конфигурационный файл и подтвердите это имя.

И как я могу пройти в MessageService<T> реализовать парадный блок MessageService<EmailService>?

Благодаря

Update

Я изменил свой класс к следующему:

public class MessageService<T> where T : ISendMessage 
    { 
     private T service; 

     [Dependency] 
     public T Service 
     { 
      get { return service; } 
      set { service = value; } 
     } 
} 

и использовать конфигурации

<alias alias="ISendMessage" type="MyNamespace.ISendMessage, MyAssembly" /> 
    <alias alias="EmailService" type="MyNamespace.EmailService, MyAssembly" /> 

<register type="ISendMessage" mapTo="EmailService"> 
     </register> 

Он работает :-)

+0

Это объяснено в документации Unity: https: // msdn.microsoft.com/en-us/library/ff660936%28v=pandp.20%29.aspx?f=255&MSPPError=-2147217396 – Tohid

ответ

6

Вы не можете просто отличить MessageService<ISendMessage> в MessageService<EmailService>. Для этого вам понадобится вариант MessageService<T>. Разница поддерживается только для интерфейсов (и делегатов). Это не единственная вещь, это «ограничение» платформы .NET (и поддержка на C# с 4.0). Таким образом, вы должны реализовать следующий интерфейс:

// note the 'out' keyword!! 
public interface IMessageService<out T> 
    where T : ISendMessage 
{ 
    T GetSendMessage(); 
} 

MessageService<T> класса будет реализовывать этот интерфейс. Но даже с этим кодом Unity не будет вводить это автоматически. Вам нужно будет сделать сопоставление между этими двумя типами. Это, например, возможная регистрация:

container.Register<MessageService<ISendMessage>>(
    new InjectionFactory(c => 
     c.Resolve<MessageService<EmailService>>())); 

Обратите внимание, что я использую конфигурацию на основе кода. Предотвратите использование конфигурации на основе XML, насколько это возможно, поскольку конфигурация XML является хрупкой, подверженной ошибкам, менее мощной и сложной в обслуживании. Только типы регистров, которые действительно нужны во время или после развертывания (и лично, даже тогда я бы не использовал XML-интерфейс вашего контейнера DI).

Смежные вопросы