俗话说:你可以用另一个层次的间接来解决所有问题,除了间接层次太多的问题Reference
通过引入包装器/适配器,您的解决方案变得更加loosely coupled。
合同
那么,首先我们来介绍下接口:
public interface IBFactory
{
B Create();
}
包装器
让我们创建包装器:
public class BWrapper: IBFactory
{
public B Create()
{
return SomeClass.StaticMethod();
}
}
另类
对于 C# 8,您可以依靠 default implementation in interface 功能将前两个步骤合二为一:
public interface IBFactory
{
public B Create()
{
return SomeClass.StaticMethod();
}
}
依赖抽象
现在让我们修改ClassWithAMethod 类以依赖IBFactory:
public class ClassWithAMethod
{
private readonly IBFactory _bFactory;
public ClassWithAMethod(IBFactory bFactory)
{
this._bFactory = bFactory;
}
public static void A(string email)
{
var b = this._bFactory.Create();
var c = b.GetUser(x => x.Email == email);
if (c != null)
{
throw new Exception();
}
}
}
您可以在 DI 容器中将 BWrapper 注册为 IBFactory 的默认实现。或者,如果您不使用 DI 或 C# 8,那么您可以指定一个无参数的 ctor,您依赖于 BWrapper。请记住,不建议使用这种方法。这更像是最后的手段。
public class ClassWithAMethod
{
private readonly IBFactory _bFactory;
public ClassWithAMethod()
{
this._bFactory = new BWrapper();
}
public ClassWithAMethod(IBFactory bFactory)
{
this._bFactory = bFactory;
}
...
}
单元测试
现在您也可以模拟该依赖项了。
var bFactoryMock = new Mock<IBFactory>();
bFactoryMock.Setup(factory => factory.Create()).Returns(...);
var SUT = new ClassWithAMethod(bFactoryMock.Object);