处理这些问题的一种方法是重构聚合(或外观)。Mark Seemann 写了一篇很好的文章,看看(其实我也强烈推荐他的书,只是说)。因此,假设您有以下内容(摘自文章):
public OrderProcessor(IOrderValidator validator,
IOrderShipper shipper,
IAccountsReceivable receivable,
IRateExchange exchange,
IUserContext userContext)
您可以将其重构为:
public OrderProcessor(IOrderValidator validator,
IOrderShipper shipper,
IOrderCollector collector)
外观在哪里OrderCollector
(它包装了前面的 3 个依赖项):
public OrderCollector(IAccountsReceivable receivable,
IRateExchange exchange,
IUserContext userContext)
我希望这有帮助。
编辑
就横切关注点(例如日志记录和缓存)和处理它们的策略而言,这里有一个建议(我通常这样做),假设您有以下内容:
public interface IOrderService
{
void DoAwesome();
}
public class OrderService : IOrderService
{
public void DoAwesome()
{
// do your thing here ... no logging no nothing
}
}
在这里,我将使用装饰器模式创建一个启用了日志记录的 OrderService:
public class OrderServiceWithLogging : IOrderService
{
private readonly IOrderService _orderService;
private readonly ILogger _logger;
public OrderServiceWithLogging(IOrderService orderService, ILogger logger)
{
_orderService = orderService;
_logger = logger;
}
public void DoAwesome()
{
_orderService.DoAwesome();
_logger.Log("Awesome is done!");
}
}
它可能看起来有点开销,但恕我直言,它干净且可测试。
另一种方法是进入面向方面的编程并研究诸如拦截之类的概念,基本上你拦截某些方法调用并因此执行任务。许多 DI 框架(我想说全部?)支持拦截,所以这可能是您更喜欢的东西。