如果模块加载两次,有没有办法立即使Ninject抛出异常

时间:2018-03-19 18:53:40

标签: c# .net ninject

下面的代码是一个简单的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>();
        }

    }

1 个答案:

答案 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());
    }