不要将 dll 文件加载到 Ninject 内核

Dont load dll files to Ninject Kernel

我在我的 Mvc 应用程序中使用 Ninject 作为 DIP 并使用它,但我想使用以下代码将一些 dll 文件加载到 ReportController 中我的 Ninject 内核中:

    private readonly IKernel _kernel;
    public ReportController(IKernel kernel)
    {
        _kernel = kernel;
    }

    public ActionResult Index()
    { 
     var directoryInfo = new DirectoryInfo(@"D:\Project\ReportDlls");
     var modules = directoryInfo.GetFiles("*.dll");
       foreach (var m in modules)
        {
            var assembly = Assembly.LoadFile(m.FullName);
            _kernel.Load(assembly);
        }

我从内核中读取了以下代码,但它的 return 空 routesProviders....为什么?

       var routesProviders = _kernel.GetAll<IReport>();
            foreach (var rp in routesProviders)
            {
                if (rp.GetType().Name == "DailyResult")
                {
                    var f = rp.GetType();
                }
            }

我的接口是 IReport,我的 Dll 派生自 IReport,在 class 我的 dll 中的 IocModule 我写了 Kernel.Bind<IReport>().To<DailyResult>(); 但它不起作用....???

IKernel扩展的方法Load(),在你传递的程序集中搜索public的INinjectModule,并调用具体的Load()方法,所以你必须包含在您传递了一些 INinjectModule 的任何程序集中,这些 INinjectModule 在 Load 方法中进行了绑定 Kernel.Bind<IReport>().To<DailyResult>();。 见参考:https://github.com/ninject/Ninject/wiki/Modules-and-the-Kernel

或者你也可以这样做

 var types= typeof(SomeClassInTheAssembly).Assembly;
        kernel.Bind(syntax => syntax.From(types)
            .SelectAllClasses()
            .BindDefaultInterface()
            .Configure(config => config.InRequestScope()));

而不是 _kernel.Load(assembly);

希望有用 X)