Ninject从程序集中动态加载存储库

本文关键字:加载 存储 动态 集中 程序 程序集 Ninject | 更新日期: 2023-09-27 17:57:52

我使用的是:

  • EF 4.1
  • MVC 3
  • Ninject
  • 九项目.扩展.约定
  • Ninject.Web.Mvc

应用程序使用存储库模式。我的存储库可以这样注入:

kernel.Bind<ICategoryRepository>().To<CategoryRepository>().InRequestScope();

一切都很好:-)

但我一直在尝试在我的global.asax.cs中从这样的组件动态注入

private static void LoadFromAssemblies(IKernel kernel)
{
    Uri uri = new Uri(
      Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) +
      @"'Extensions");
    DirectoryInfo directoryInfo = new DirectoryInfo(uri.LocalPath);
    var scanner = new AssemblyScanner();
    scanner.FromAssembliesInPath(directoryInfo.FullName);
    scanner.BindWith<DefaultBindingGenerator>();
    kernel.Scan(scanner);
    //var foo = kernel.Get<ICategoryRepository>();
}

在运行时,存储库确实被注入,但由于某种原因,实体从未被保存——也许是因为存储库无法判断是否有更改?或者整个请求中没有维护工作单元?

我的问题是:从程序集动态加载时,如何实现"InRequestScope"?我必须以某种方式注入内核吗?

Ninject从程序集中动态加载存储库

这种方法(标记为***)回答并解决了问题(复制自@John Barrett的评论):

kernel.Scan(a =>
  {
    a.FromAssembliesInPath(directoryInfo.FullName);
    a.AutoLoadModules();
    a.BindWithDefaultConventions();
    a.InRequestScope();  // <-- ***
  });