.net 如何使用接口解决隐藏的依赖关系

.net 如何使用接口解决隐藏的依赖关系,.net,unit-testing,interface,.net,Unit Testing,Interface,我有一个代码,棋盘和棋子都注入了接口。对角线方向是枚举。到目前为止,一切顺利。我不注入依赖项,也不使用隐藏依赖项 private void addToAllowedPositions(IChessboard chessboard, IPiece piece, DiagonalDirections direction) { int horizontalIndex = piece.Position.IndexHorizontal; int verticalIn

我有一个代码,棋盘和棋子都注入了接口。对角线方向是枚举。到目前为止,一切顺利。我不注入依赖项,也不使用隐藏依赖项

private void addToAllowedPositions(IChessboard chessboard, IPiece piece, DiagonalDirections direction)
    {
        int horizontalIndex = piece.Position.IndexHorizontal;
        int verticalIndex = piece.Position.IndexVertical;
        while (AreIndexesValid(setHorizontalIndexDirection(direction, ref horizontalIndex), setVerticalIndexDirection(direction, ref verticalIndex)))
        {
            IPosition currentPosition = new Position(horizontalIndex, verticalIndex);
            IPiece currentPiece = chessboard.GetPiece(currentPosition);
            if (currentPiece == null)
                 {
                     allowedPositions.Add(currentPosition);
                 }
            else if (currentPiece.Color != piece.Color)
                 {
                     allowedPositions.Add(currentPosition);
                     break;
                 }
                 else break;
         }
    }
这行代码有问题:

IPosition currentPosition = new Position(horizontalIndex, verticalIndex);

我真的不知道如何使用这里的界面?每次都必须创建新职位。这是我唯一的依赖,我不知道如何隔离。当我想对这段代码进行单元测试时,我也遇到了一个问题。如果Position类中有任何更改,它也会立即反映在现有单元测试的此方法中。

您可以将工厂方法添加到
IChessboard
界面:

IPosition currentPosition = chessboard.CreatePosition(horizontalIndex, verticalIndex);

您可以使用工厂创建新职位。
Position
是POCO吗?是的。只有两个属性-水平和垂直。如何使用工厂?也许您有这样的例子?您不必在方法中手动创建位置,而是将创建委托给其他对象。您可以创建一个新的factory服务,其唯一任务是创建职位,也可以在现有接口之一上使用factory方法。有人已经回答说,你可以在棋盘界面上有一个工厂方法来创建位置。这是否意味着(在现有界面上创建位置的方法)我会将棋盘和位置耦合起来?如果你不知道两者之间的关联,那么就创建一个专用接口来创建位置。(单一责任)。但这意味着要么通过方法注入服务,要么通过构造函数注入服务。您可以选择。这不是意味着棋盘和位置之间存在依赖关系吗?棋盘实现选择返回
IPosition
的哪个实现,无论是标准
Position
类还是其他什么,但是如果
IPosition
只是一对数字,没有实际行为,它实际上不需要是一个接口。