依赖注入 (DI) 和单一职责原则 (SRP) 高度相关。
SRP 基本上是说每个班级应该只做一件事,而将所有其他事情委托给不同的班级。例如,你的serializeMessageObjects
方法应该被提取到它自己的类中——我们称之为它MessageObjectSerializer
。
DI 意味着将MessageObjectSerializer
对象作为参数注入(传递)给您的MessageQueue
对象——无论是在构造函数中还是在对consumeMessages
方法的调用中。您可以使用 DI 框架来执行此操作,但我建议手动执行此操作以获取概念。
现在,如果您为 . 创建一个接口MessageObjectSerializer
,您可以将其传递给MessageQueue
,然后您将获得该模式的全部价值,因为您可以创建模拟/存根以便于测试。突然,consumeMessages
不必注意如何serializeMessageObjects
表现。
下面,我试图说明这种模式。请注意,当您想要测试 consumeMessages 时,您不必使用该MessageObjectSerializer
对象。您可以制作一个模拟或存根,它完全按照您的要求进行操作,然后传递它而不是具体类。这确实使测试变得更加容易。请原谅语法错误。我无法访问 Visual Studio,因此它是在文本编辑器中编写的。
// THE MAIN CLASS
public class MyMessageQueue()
{
IMessageObjectSerializer _serializer;
//Constructor that takes the gets the serialization logic injected
public MyMessageQueue(IMessageObjectSerializer serializer)
{
_serializer = serializer;
//Also a lot of other injection
}
//Your main method. Now it calls an external object to serialize
public void consumeMessages()
{
//Do all the other stuff
_serializer.serializeMessageObjects()
}
}
//THE SERIALIZER CLASS
Public class MessageObjectSerializer : IMessageObjectSerializer
{
public List<MessageObject> serializeMessageObjects()
{
//DO THE SERILIZATION LOGIC HERE
}
}
//THE INTERFACE FOR THE SERIALIZER
Public interface MessageObjectSerializer
{
List<MessageObject> serializeMessageObjects();
}
编辑:对不起,我的例子是在 C# 中。我希望你无论如何都能使用它:-)