下面的代码是一个简单的global.asax。 CoreModule是一套应用程序的主要模块 - 而WebAPIModule是一个继承了包装标准Ninject模块的包装类的模块,但为依赖模块添加了一个字段。如果该字段中列出了任何内容,则会加载它们。因此,如果您恰好将CoreModule列为依赖项,但具有以下代码,则CoreModule将被加载两次。这会产生瞬间出现的瞬态错误,并且难以可靠地找到。有没有办法让Ninject抛出异常或者如果加载相同的Type两次会更快失败?我还没有见过一个,但是有办法快速失败会很好。
public class WebApiApplication : NinjectHttpApplication
{
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
GlobalConfiguration.Configure(WebApiConfig.Register);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
RegisterServices(kernel);
return kernel;
}
private void RegisterServices(IKernel kernel)
{
kernel.Load<CoreModule>();
kernel.Load<WebAPIModule>();
}
}
答案 0 :(得分:1)
您是否动态加载程序集?
如果您尝试加载已加载的模块,Ninject将抛出错误。
您可以创建一个扩展方法,将内核中已存在的模块与您尝试加载的模块进行比较,并仅加载那些尚不存在的模块。
将Assemblies的这些扩展方法复制到您自己的扩展方法类中,以及下面的内容:Ninject Assembly Extensions
ExtensionsForKernel.cs
/// <summary>
/// Loads modules from specified assemblies that don't already exist in the kernel.
/// </summary>
public static void LoadIfNotLoaded(this IKernel kernel, IEnumerable<Assembly> assemblies)
{
var existingModules = kernel.GetModules();
var newModules = assemblies.SelectMany(a => a.GetNinjectModules())
.Where(m => !existingModules.Any(em => em.GetType() == m.GetType()));
kernel.Load(newModules);
}
NinjectWebCommon.cs
private static void RegisterServices(IKernel kernel)
{
kernel.LoadIfNotLoaded(AppDomain.CurrentDomain.GetAssemblies());
}