Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这两个服务中使用ninject会在c中创建循环依赖关系#_C#_Web Services_Dependency Injection_Ninject - Fatal编程技术网

C# 在这两个服务中使用ninject会在c中创建循环依赖关系#

C# 在这两个服务中使用ninject会在c中创建循环依赖关系#,c#,web-services,dependency-injection,ninject,C#,Web Services,Dependency Injection,Ninject,我有两个服务,你可以从这些构造函数中看到: public ReceptionService(DataContext ctx, IPaymentService PaymentService, IReceptionHistoryService ReceptionHistoryService, ITestService TestService, ITestRepository TestRepository ,IReferredRepository ReferredRepository, IAutomo

我有两个服务,你可以从这些构造函数中看到:

public ReceptionService(DataContext ctx, IPaymentService PaymentService, IReceptionHistoryService ReceptionHistoryService, ITestService TestService, ITestRepository TestRepository ,IReferredRepository ReferredRepository, IAutomotiveRepository AutomotiveRepository,IReceptionRepository ReceptionRepository,IReferredService ReferredService,IAutomotiveService AutomotiveService)
    {
        _ctx = ctx;
        _automotiveRepository = AutomotiveRepository;
        _referredRepository = ReferredRepository;
        _receptionRepository = ReceptionRepository;
        _referredService = ReferredService;
        _automotiveService = AutomotiveService;
        _testService = TestService;
        _receptionHistoryService = ReceptionHistoryService;
        _paymentService = PaymentService;
    }
另一个:

 public TestService(DataContext ctx, IReceptionService ReceptionService ,IParameterService ParameterService, ILineService LineService, ITestRepository TestRepository, IReceptionHistoryService ReceptionHistoryService
        , IReceptionHistoryRepository ReceptionHistoryRepository)
    {
        _TestRepository = TestRepository;
        _parameterService = ParameterService;
        _receptionHistoryRepository = ReceptionHistoryRepository;
        _receptionHistoryService = ReceptionHistoryService;
        _lineService = LineService;
        _ctx = ctx;
    }
有了这些构造函数,一切都很好,但当我将
ReceptionService
添加到
TestService
时,如下所示:

 public TestService(DataContext ctx, IReceptionService ReceptionService ,IParameterService ParameterService, ILineService LineService, ITestRepository TestRepository, IReceptionHistoryService ReceptionHistoryService
        , IReceptionHistoryRepository ReceptionHistoryRepository)
    {
        _TestRepository = TestRepository;
        _parameterService = ParameterService;
        _receptionHistoryRepository = ReceptionHistoryRepository;
        _receptionHistoryService = ReceptionHistoryService;
        _lineService = LineService;
        _ReceptionService = ReceptionService;
        _ctx = ctx;
    }
我得到这个错误:

Error activating IReceptionService using binding from IReceptionService to ReceptionService
A cyclical dependency was detected between the constructors of two services.

Activation path:
 5) Injection of dependency IReceptionService into parameter ReceptionService of constructor of type TestService
 4) Injection of dependency ITestService into parameter TestService of constructor of type ReceptionService
 3) Injection of dependency IReceptionService into parameter ReceptionService of constructor of type TestService
 2) Injection of dependency TestService into parameter instance of constructor of type NinjectIISHostingServiceHost{TestService}
 1) Request for NinjectIISHostingServiceHost{TestService}

Suggestions:
 1) Ensure that you have not declared a dependency for IReceptionService on any implementations of the service.
 2) Consider combining the services into a single one to remove the cycle.
 3) Use property injection instead of constructor injection, and implement IInitializable
    if you need initialization logic to be run after property values have been injected.

我的经验是,循环依赖通常是由(SRP)冲突引起的。换句话说,作为周期一部分的一个或多个类有太多的职责

这两个类都有很多依赖关系。这是一种被调用的代码气味,构造函数过度注入也是SRP违规的一种指示


换句话说:您的类违反了SRP,解决方案是将它们拆分为多个更小、更细粒度的组件。这不仅解决了SRP(以及由此引起的可维护性问题),还解决了循环依赖性问题。

您将ITestService注入到ReceptionService中,将IReceptionService注入到TestService中。我并不奇怪这不起作用。我不确定你的问题是什么,但如果是“如何消除此错误?”,答案是“如果B依赖于A,则不要使A依赖于B”。可能重复@oerkelens我需要TestService内部的接收服务如果你需要测试服务内部的接收服务,那么很好,使用它。但是,如果您还需要接收服务中的测试服务,那么就有问题了,您需要重新考虑您的应用程序架构。