2016-05-18 2 views
2

У меня есть класс, который использует обработчик впрыскивается сделать что-тоПравильный способ инъекционные зависимостей

class MyClass 
{ 
    private readonly _handler; 

    //Injected here 
    public MyClass(IHandler handler) 
    { 
     _handler=handler; 
    } 

    public MyMethod(Param p) 
    { 
     var request= Transform(p); 
     _handler.DoSomething(Request1 request) 
    } 
} 

Теперь, в зависимости от ситуации, я мог бы иметь другую реализацию IHandler, но которые могли бы принять Request2 к DoSomething(). Я могу сделать Request1 и Request2 из базы RequestBase и может изменить IHandler исполнение DoSomething() принять RequestBase. Но перед вызовом DoSomething() мне все еще нужно знать, какие конкретные Request (или Request2) пройти, что нарушает цель инъекции зависимости в первую очередь. Может ли кто-нибудь предложить лучший способ сделать это? Или это совершенно неправильный способ взглянуть на него?

+2

', который нарушает назначение инъекции зависимостей в первом месте', не зависит от того, что вы пытаетесь передать, поэтому ваша проблема не связана с DI вообще –

+1

ответ на ваш вопрос: каждый экземпляр IHandler должен работать с Request1 - это контракт, который вы создали. он не может «взять запрос2». Вероятно, вам нужно настроить свой IHandler, чтобы предоставить другой метод «doSomethingWithRequest2» –

ответ

0

Одним из способов может быть реализация IHandler с общим типом, который является принятым типом параметра DoSomething.

interface IHandler<T> 
{ 
    void DoSomething(T p) 
} 

Это позволит устранить необходимость в вашем методе Transform.

Если request1 и request2 наследуют от BaseRequest (например), вы можете изменить его на нижеследующее.

interface IHandler<T> where T : BaseRequest 
{ 
    void DoSomething(T p) 
} 
+0

хороший указатель, позвольте мне исследовать в этой строке. Благодарю. – Danny

0

Ваш код нарушает инкапсуляцию и вводит сильную связь этих двух линий:

var request= Transform(p); 
    _handler.DoSomething(Request1 request) 

Тонкие, как это, все реализации IHandler.DoSomething тесно связаны с Transform.

Вместо вышеперечисленного я сделаю операции внутри Transform часть реализации DoSomething.

Конкретизируя сильной связи я упоминаю в открытии ... Потому что ваш код написан в процедурном образом, bevaiour из DoSomething зависит от того, Transform возвращается, то есть, все реализации DoSomething нужно будет знать, что ожидать от Transform, чтобы выполнить их требования.

В дополнение к этому метод MyMethod имеет очень глубокое знание внутренних компонентов Transform, чтобы упорядочить последовательность вызовов в этих двух строках кода. В этом случае инкапсуляция нарушается.

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