代码之家  ›  专栏  ›  技术社区  ›  Richard Ev

依赖注入——这是它的本意吗?[关闭]

  •  3
  • Richard Ev  · 技术社区  · 15 年前

    我们的项目正在使用基于构造函数的依赖注入(我们使用Unity作为容器),并且我们有许多构造函数获得了大量参数。

    例如:

        public FooRequestService(
            ITransactionDataBuilder transactionDataBuilder,
            IMapper<SaveFooRequest, FooRequestMessage> saveFooRequestToFooRequestMapper,
            IFooRequestedThingRepository fooRequestedThingRepository,
            IFooRequestedThingBuilder fooRequestedThingBuilder,
            IMapper<IEnumerable<FooRequestedThing>, IEnumerable<FoundFooRequestedThing>> fooRequestedThingsToFoundFooRequestedThingsMapper,
            IAutomatedFooWcfService automatedFooService,
            IFooArrivalMessageProvider fooArrivalMessageProvider,
            ISeatCancellation cancellation,
            IPostSalesService postSalesService,
            ITransactionEnquiryService transactionService,
            IMapper<IEnumerable<FooRequestedThing>, List<ThingArrivedForFoo>> thingArrivalRequestDocumentMapper,
            IMapper<SaveFooRejected, FooRejectedMessage> saveFooRejectedToFooRejectedMapper,
            IPartialFooConfiguration partialFooConfiguration,
            ICurrentDateTimeProvider currentDateTimeProvider,
            IMapper<FooRequestMessage, List<FooRequested>> tracsFooRequestMapper,
            IThreeWayMerger<Transaction, TransactionService.Contract.Transaction, NotifyFooRequestedRequest, SaveFooRequest> saveFooRequestMerger,
            KioskWebServiceSoap kioskServiceGateway)
        {
            // code here to set injected values to member variables
        }
    

    这个类总共有大约370行代码,表示系统的核心部分,因此有大量的依赖项。

    • 从DI的角度来看,通常有这么多参数传递给构造函数吗?
    • 一般方法从封装和范围方面与我有关。所有依赖项都可以从类内的任何地方使用,即使它们(严格地说)只能从单个方法(例如)使用
    3 回复  |  直到 10 年前
        1
  •  3
  •   Konamiman    15 年前

    是的,这是正确的方法。如果你的类中有这么多的依赖项,也许你应该回顾一下你的系统架构/设计(也许你可以把类分成更小的类;这只是一个建议,你的类可能已经很好了),但是从DI的角度来看,这是可以的。

        2
  •  1
  •   James Gregory    15 年前

    不,不应该是那样的。你的 FooRequestService 如果它具有所有这些依赖性,那么它的责任就太多了。您应该重构逻辑上关联到单独服务中的依赖项,从而创建更可重用的组件,同时(更重要的)大大减少依赖项 请求服务 有。

    关于你的范围界定评论,这是一个有太多责任的班级的另一个症状。您希望将依赖关系范围限定到的那些方法应该提取到一个单独的类中。

        3
  •  0
  •   Daniel Elliott    15 年前

    我在使用依赖注入时也经历过类似的行为。

    我想你会从使用 parameter object refactoring .

    仁慈,