我有一个使用注入处理程序来做某事的类
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()
的{{1}}实施。但在调用RequestBase
之前,我仍然需要知道要传递哪个特定DoSomething()
(Request
或Request1
),从而打破了首先注入依赖项的目的。有人可以提出更好的方法吗?或者这是一种完全错误的观察方式?
答案 0 :(得分:0)
一种方法是使用通用语IHandler
来实现DoSomething
。
interface IHandler<T>
{
void DoSomething(T p)
}
这样就无需使用Transform
方法。
如果request1
和request2
继承自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
的内部结构,以便在这两行代码中协调调用序列。这是违反封装的地方。