在c#中的绑定中的注入错误在两个服务的构造函数之间检测到循环依赖性

时间:2017-06-19 13:27:51

标签: c# ninject ninject.web

我有一个类,你可以看到它的构造函数:

 public class Global : NinjectHttpApplication
    {
        protected override IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Reception.Domain.Repository.IAutomotiveRepository>().To<Reception.Infrustructure.RepositoryImplement.AutomotiveRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IReceptionRepository>().To<Reception.Infrustructure.RepositoryImplement.ReceptionRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IReferredRepository>().To<Reception.Infrustructure.RepositoryImplement.ReferredRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.ITestRepository>().To<Reception.Infrustructure.RepositoryImplement.TestRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IReceptionHistoryRepository>().To<Reception.Infrustructure.RepositoryImplement.ReceptionHistoryRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IGasReceptionHistoryRepository>().To<Reception.Infrustructure.RepositoryImplement.GasReceptionHistoryRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IGasReceptionRepository>().To<Reception.Infrustructure.RepositoryImplement.GasReceptionRepositoy>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IGasTestRepository>().To<Reception.Infrustructure.RepositoryImplement.GasTestRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IHydrostaticReceptionHistoryRepository>().To<Reception.Infrustructure.RepositoryImplement.HydrostaticReceptionHistoryRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IHydrostaticReceptionRepository>().To<Reception.Infrustructure.RepositoryImplement.HydrostaticReceptionRepository>().InRequestScope();
            kernel.Bind<Reception.Domain.Repository.IHydrostaticTestRepository>().To<Reception.Infrustructure.RepositoryImplement.HydrostaticTestRepository>().InRequestScope();


            kernel.Bind<Reception.Domain.Service.IAutomotiveService>().To<Reception.Application.ServiceImplement.AutomotiveService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IReceptionService>().To<Reception.Application.ServiceImplement.ReceptionService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IReferredService>().To<Reception.Application.ServiceImplement.ReferredService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.ITestService>().To<Reception.Application.ServiceImplement.TestService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IReceptionHistoryService>().To<Reception.Application.ServiceImplement.ReceptionHistoryService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IGasReceptionHistoryService>().To<Reception.Application.ServiceImplement.GasReceptionHistoryService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IGasReceptionService>().To<Reception.Application.ServiceImplement.GasReceptionService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IGasTestService>().To<Reception.Application.ServiceImplement.GasTestService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IHydrostaticReceptionHistoryService>().To<Reception.Application.ServiceImplement.HydrostaticReceptionHistoryService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IHydrostaticReceptionService>().To<Reception.Application.ServiceImplement.HydrostaticReceptionService>().InRequestScope();
            kernel.Bind<Reception.Domain.Service.IHydrostaticTestService>().To<Reception.Application.ServiceImplement.HydrostaticTestService>().InRequestScope();


            kernel.Bind<DataContext>().To<DataContext>().InSingletonScope();
            return kernel;
        }
}

在全球范围内,我定义了这个:

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

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

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.

但是当我的页面出现错误时,我发现了这个错误:

def function_1(command):
    subprocess.call(['{0} ; {1} ; {2}; {3}'.format(var_0, var_1, var_2, command)])

1 个答案:

答案 0 :(得分:1)

ReceptionService构造函数需要ReceptionService实例:

public ReceptionService(/.../, IReceptionService ReceptionService, /.../)

因此,为了建立接待服务,您首先需要建立接待服务?我怀疑这是一个混淆框架的周期性依赖。除非有其他构造函数可以在依赖注入器中以某种方式配置,否则它将无限期地尝试通过尝试构建ReceptionService来构建ReceptionService

我想第一步是概念性地确定该类为什么需要自己的实例。我怀疑它可能没有,但我不知道你在建造什么。

相关问题