我使用依赖注入已经有一段时间了,我真的很喜欢这个技术,但是我经常遇到太多的依赖项,需要注入4-5,这看起来很大。
但我想不出更简单的办法。例如,我有一个具有发送消息的业务逻辑的类,它接受另外两个业务逻辑依赖项来执行所需的任务(一个用于将数据转换为发送的消息,另一个用于翻译接收到的消息)。
但除此之外,它还需要一些“技术”依赖,比如ILogger、ITimerFactory (因为它需要在内部创建计时器)、IKeyGenerator (生成唯一的键)。
所以整个名单都变大了。有什么好的共同方法来减少依赖的数量吗?
发布于 2013-08-13 08:29:08
处理这些问题的一种方法是向集合(或正面)重构。Mark写了一篇很好的文章,看看这个 (实际上,我也非常推荐他的书 )。因此,假设您有以下内容(摘自本文):
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!");
}
}它可能看起来有点开销,但IMHO,它是干净的和可测试的。
另一种方法是进行面向方面的编程,并研究诸如拦截之类的概念,在这种情况下,基本上可以拦截某些方法调用并执行任务。很多DI框架(我想说全部?)支持拦截,所以这可能是你喜欢的东西。
https://stackoverflow.com/questions/18204113
复制相似问题