在一个解决方案中的两个项目中使用Ninject,一个循环依赖异常

时间:2015-11-11 16:02:21

标签: c# asp.net-mvc asp.net-web-api ninject

我在同一解决方案中的两个项目中使用Ninject。在带有Views和Web.API项目的MVC中。但是,当我尝试同时运行这两个项目时,我在Web API NinjectWebCommon.cs中遇到以下异常 -

  

使用绑定来激活ModelValidatorProvider时出错   ModelValidatorProvider to NinjectDefaultModelValidatorProvider A.   在两个构造函数之间检测到周期性依赖性   服务。

但如果我只运行Web API项目,我就不会遇到上述异常。 我在两个项目中都有NinjectWebCommon.cs个文件。

在Web API中 -

public static void Start() //The method looks the same for MVC Project
{
    DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
    DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
    bootstrapper.Initialize(CreateKernel); 
}

private static IKernel CreateKernel()
{
    var kernel = new StandardKernel();
    try
    {
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();           

        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);    
        RegisterServices(kernel);
        return kernel;
     }
     catch
     {
        kernel.Dispose();
        throw;
     }
}        
private static void RegisterServices(IKernel kernel)
{
    WebIoC.RegisterServices(kernel);
}

和MVC项目 -

private static IKernel CreateKernel()
{
    var kernel = new StandardKernel();
       try
       {
           kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
           kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();               

           RegisterServices(kernel);
           RegisterServiceLocator(kernel);

           return kernel;
        }
        catch
        {
            kernel.Dispose();
            throw;
        }
}

private static void RegisterServiceLocator(StandardKernel kernel)
{
    var locator = new NinjectServiceLocator(kernel);

    ServiceLocator.SetLocatorProvider(() => locator);
}

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IFormsAuthenticationService>().To<FormsAuthenticationService>();
    kernel.Bind<IAdMembershService>().To<ActiveDirectoryMembershipService>();
    kernel.Bind<IFacebookAuthenticationService>().To<FacebookAuthenticationService>();            
}

我在bootstrapper.Initialize(CreateKernel);方法的Start()中遇到此异常。有没有人遇到过同样的问题?

更新:如果重要的话,我还在两个项目中使用以下代码进行启动。

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Path.to.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(Path.to.NinjectWebCommon), "Stop")]

1 个答案:

答案 0 :(得分:4)

以前发生过这种情况,请参阅Ninject Issue 131

Arindamat提出了以下问题:

_kernel
    .Bind<DefaultModelValidatorProviders>()
    .ToConstant(new DefaultModelValidatorProviders(
         config.Services.GetServices(
             typeof (ModelValidatorProvider))
         .Cast<ModelValidatorProvider>()));

摆脱了循环依赖。

但是,根本原因通常是ninject的拙劣安装。 This答案显示了如何修复它。

相关问题