如何将此代码转换为现在使用依赖注入模式?
好的,所以我有以下情况。 我原来有这样的代码:
public class MainBoard {
private BoardType1 bt1;
private BoardType2 bt2;
private BoardType3 bt3;
...
private readonly Size boardSize;
public MainBoard(Size boardSize) {
this.boardSize = boardSize;
bt1 = new BoardType1(boardSize);
bt2 = new BoardType2(boardSize);
bt3 = new BoardType3(boardSize);
}
}
现在,我决定重构该代码,以便注入类的依赖关系,而不是:
public class MainBoard {
private IBoardType1 bt1;
private IBoardType2 bt2;
private IBoardType3 bt3;
...
private Size boardSize;
public MainBoard(Size boardSize, IBoardType1 bt1, IBoardType2 bt2, IBoardType3 bt3) {
this.bt1 = bt1;
this.bt2 = bt2;
this.bt3 = bt3;
}
}
我的问题是如何处理棋盘大小? 我的意思是,在第一种情况下,我只是通过了所需的电路板尺寸的类,它会尽一切努力以正确尺寸创建其他类型的电路板。 在依赖注入的情况下,情况可能并非如此。 你们在这种情况下做什么? 你是否在MainBoard
的构造函数中进行了任何类型的检查,以确保正确的尺寸被传入? 你是否认为班级的客户将有足够的责任去通过相同尺寸的3种板,所以没有问题?
编辑
我为什么要这样做? 因为我需要单元测试MainBoard。 我需要能够在某些状态下设置3个子板,以便测试我的MainBoard正在做我期望的操作。
谢谢
我会说在第二种情况下boardSize
参数是不必要的,但我会添加一个断言来确保3个电路板尺寸真的相等。
但总的来说,第二起案件似乎对我来说可疑。 我会建议第一种方法,除非你真的需要在主板上注入不同类型的板。 即便如此,我也会考虑使用例如一个电路板工厂,而不是将3个电路板参数传递给构造函数,例如
public interface IBoardBuilderFactory {
public IBoardType1 createBoardType1(Size boardSize);
public IBoardType2 createBoardType2(Size boardSize);
public IBoardType3 createBoardType3(Size boardSize);
}
这将确保3个电路板在“电路板系列”和尺寸方面的一致性。
我们应该更多地了解上下文/领域模型,特别是主板和子板的关系,以决定DI是否是正确的选择。
在这种情况下,是否应该应用依赖注入(或依赖倒置)是个问题。 在我看来,您的MainBoard
负责管理它在第一个示例中创建的BoardTypes
的生命周期 。 如果您现在注入BoardTypes,则此责任必须由MainBoard
的使用者处理。
它是消费者方面的灵活性和附加关税之间的交易。
另一方面,如果可以在外部处理BoardType
的生命周期是明智的,则可以使用依赖倒置。 您在构造函数MainBoard
则需要确保它的依赖正确statisfied。 这将包括检查他们的Size
是否相等。
依赖性注入的主要优点是与被注入对象的变化绝缘。 所以在你的情况下,一个变量显然是大小。 您可以将主板注入主板,以便主板不再需要知道或担心其尺寸。 此外,除非您的应用程序需要在不同的主板类型之间保持3种不同的行为,否则我会建议使用板类型接口的单个抽象定义。
public class MainBoard {
private IBoardType bt1;
private IBoardType bt2;
private IBoardType bt3;
public MainBoard(IBoardType bt1, IBoardType bt2, IBoardType bt3) {
this.bt1 = bt1;
this.bt2 = bt2;
this.bt3 = bt3;
}
}
注射(注射框架或组装代码)确保这些板子具有适当的尺寸,这成为了事物的责任。 这可以通过多种方式完成,其中一个示例是主板,并且注入的板都从单个外部源获得它们的大小。 也许你的应用程序,在这种情况下,相对于主板大小的注入板。
所以你可以有外部逻辑,例如:
public class BoardAssembler {
public static MainBoard assembleBoard(Size size) {
Size innerBoardSize = deriveSizeOfInternalBoards(size);
return new MainBoard(new BoardType1(innerBoardSize), new BoardType2(innerBoardSize), new BoardType3(innerBoardSize));
}
}
本质上你所追求的是在任何构建MainBoard的地方反转构造逻辑。 从那里开始,将所有东西提取到工厂或一些邪恶的单体工厂或静态方法中。 问问自己,“MainBoard在哪里创建的?” 还问:“需要哪些组分和参数?” 将所有实例化逻辑移至工厂后,维护主板及其所有依赖关系可能会变得更加简单。
链接地址: http://www.djcxy.com/p/77755.html上一篇: How to convert this code so it now uses the Dependency Injection pattern?
下一篇: Is the Service Locator pattern any different from the Abstract Factory pattern?