【问题标题】:Injecting a service into another service将一个服务注入另一个服务
【发布时间】:2013-12-22 21:39:55
【问题描述】:

我有一个 MVC 项目,它有两个服务一个 OrganisationService 和一个 AgreementService,我的问题是一些组织属于一个组/父结构,在这种情况下,我需要获取属于任何一个的所有协议组内的组织。

我的 OrganisationService 中已经有一个方法可以返回结构中组织的所有 id 列表:

IEnumerable<int> GetRelatedOrganisationIds(int id)

我可以在 AgreementService 中创建一个方法来接受这个结果,但是我需要将这两个服务注入我的控制器并依次调用它们,例如

GetAgreementsByOrganisationIdList(IEnumerable<int> organisationIdList)

可以将 OrganisationService 注入到 AgreementService 中以便它自己完成工作吗?例如,以下方法将在内部调用 GetRelatedOrganisationIds:

GetAgreementsByOrganisationId(int id)

我想将它注入到 AgreementService 中的另一个原因是,我不需要记住检查组织是否处于组/父关系中并在每次想要获取协议列表时查找 ID。

我还想过创建一个 OrganisationGroupParentInformationProvider 并将其注入到 AgreementService 中,我可能花了太多时间考虑这个......你会怎么做?

【问题讨论】:

    标签: c# asp.net-mvc dependency-injection service-layer


    【解决方案1】:

    是的,可以将一个服务注入另一个服务的构造函数。但是,您可能需要考虑为 OrganisationService 创建一个接口,并让您的 AgreementService 依赖于该抽象。

    另一种方法是创建一个依赖于 AgreementService 和 OrganisationService 的新服务,并让该新服务履行职责。新服务当然会被注入到您的控制器中。

    作为指导,请考虑将其全部置于 AgreementService 下是否会违反单一职责原则和/或接口隔离原则。如果是这样,请创建一个新服务。

    【讨论】:

      【解决方案2】:

      是否可以将 OrganisationService 注入到 AgreementService 中,以便它自己完成工作?

      那不会是注入它。那将使它成为对它的依赖。无论如何,我会说你拥有它的方式是一个更好的架构,因为它更易于测试。通过让协议服务自己调用组织服务,它的可测试性肯定会降低,因为您将不得不在某处注入组织服务的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2014-01-27
        • 1970-01-01
        • 2023-03-16
        • 2017-07-05
        相关资源
        最近更新 更多