我在同一解决方案中的两个项目中使用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")]
答案 0 :(得分:4)
以前发生过这种情况,请参阅Ninject Issue 131。
Arindamat提出了以下问题:
_kernel
.Bind<DefaultModelValidatorProviders>()
.ToConstant(new DefaultModelValidatorProviders(
config.Services.GetServices(
typeof (ModelValidatorProvider))
.Cast<ModelValidatorProvider>()));
摆脱了循环依赖。
但是,根本原因通常是ninject的拙劣安装。 This答案显示了如何修复它。