首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少依赖的数量的好方法是什么?

减少依赖的数量的好方法是什么?
EN

Stack Overflow用户
提问于 2013-08-13 08:25:53
回答 1查看 668关注 0票数 3

我使用依赖注入已经有一段时间了,我真的很喜欢这个技术,但是我经常遇到太多的依赖项,需要注入4-5,这看起来很大。

但我想不出更简单的办法。例如,我有一个具有发送消息的业务逻辑的类,它接受另外两个业务逻辑依赖项来执行所需的任务(一个用于将数据转换为发送的消息,另一个用于翻译接收到的消息)。

但除此之外,它还需要一些“技术”依赖,比如ILoggerITimerFactory (因为它需要在内部创建计时器)、IKeyGenerator (生成唯一的键)。

所以整个名单都变大了。有什么好的共同方法来减少依赖的数量吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-13 08:29:08

处理这些问题的一种方法是向集合(或正面)重构。Mark写了一篇很好的文章,看看这个 (实际上,我也非常推荐他的书 )。因此,假设您有以下内容(摘自本文):

代码语言:javascript
复制
public OrderProcessor(IOrderValidator validator,
                      IOrderShipper shipper,
                      IAccountsReceivable receivable,
                      IRateExchange exchange,
                      IUserContext userContext)

您可以将其重构为:

代码语言:javascript
复制
public OrderProcessor(IOrderValidator validator,
                      IOrderShipper shipper,
                      IOrderCollector collector)

其中OrderCollector是一个外观(它封装了前面的3个依赖项):

代码语言:javascript
复制
public OrderCollector(IAccountsReceivable receivable,
                      IRateExchange exchange,
                      IUserContext userContext)

我希望这能帮到你。

编辑

关于横切关注点(例如日志记录和缓存)和处理这些问题的策略,这里有一个建议(这是我通常做的),假设您有以下内容:

代码语言:javascript
复制
public interface IOrderService
{
    void DoAwesome();
}

public class OrderService : IOrderService
{
    public void DoAwesome()
    {
        // do your thing here ... no logging no nothing
    }
}

在这里,我使用装饰器模式来创建一个启用了日志记录的OrderService:

代码语言:javascript
复制
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框架(我想说全部?)支持拦截,所以这可能是你喜欢的东西。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18204113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档