注入依赖关系的正确方法

时间:2016-05-18 19:40:40

标签: c# oop architecture dependencies

我有一个使用注入处理程序来做某事的类

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的实现,但可能需要Request2DoSomething()。我可以从基础Request1派生Request2RequestBase,并可以更改IHandler DoSomething()的{​​{1}}实施。但在调用RequestBase之前,我仍然需要知道要传递哪个特定DoSomething()RequestRequest1),从而打破了首先注入依赖项的目的。有人可以提出更好的方法吗?或者这是一种完全错误的观察方式?

2 个答案:

答案 0 :(得分:0)

一种方法是使用通用语IHandler来实现DoSomething

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

这样就无需使用Transform方法。

如果request1request2继承自BaseRequest(例如),您可以将其更改为以下内容。

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

答案 1 :(得分:0)

您的代码打破了封装并在这两行中引入了强耦合:

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

虽然很微妙,但IHandler.DoSomething的所有实现都与Transform紧密耦合。

而不是上述内容,我会将Transform内部的操作作为DoSomething实现的一部分。

阐述我在开场时提到的强耦合......因为你的代码是以程序方式编写的,DoSomething的重要性取决于Transform返回的内容,即DoSomething的所有实现{1}}需要知道对Transform的期望,才能满足他们的要求。

除此之外,方法MyMethod非常了解Transform的内部结构,以便在这两行代码中协调调用序列。这是违反封装的地方。