如何使用静态方法的依赖注入?

The*_*ght 12 static-methods dependency-injection

想象一下,有一个Customer带有实例Load()方法的类.

Load()调用该方法时,它会通过例如检索订单详细信息

var orders = Order.GetAll(customerId, ...);
Run Code Online (Sandbox Code Playgroud)

GetAll()是类的静态方法,Order输入参数是Customer类中定义的字段.

正如您所看到的,OrderCustomer类的依赖项,但是,我不能只创建一个IOrder并将其注入,因为接口不能有静态方法.

因此,问题是如何在此示例中引入依赖注入?

我不想创建GetAll()一个实例方法,因为它是一个静态方法,需要保持这种方式.

例如,我在我的设计中使用了实用程序类,其中大多数只包含静态方法.

Pau*_*ips 12

如果必须保留静态方法,我会将静态调用包装在Repository对象中.

像这样:

interface IOrderRepository {
   IEnumerable<IOrder> GetAll(customerId, ..);
}

class OrderRepository : IOrderRepository {
   IEnumerable<IOrder> GetAll(customerId, ...)
   {
     Order.GetAll(customerId,...); // The original static call.
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,您将此存储库注入您的Customer类.

(我假设你正在这样做,所以你可以在运行时为测试目的注入假的IOrders.我应该说,一般来说,静态方法是测试的一个严重障碍.)