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

发布于 2024-11-09 22:05:18 字数 1017 浏览 0 评论 0原文

我正在使用:

  • EF 4.1
  • MVC 3
  • Ninject
  • Ninject.Extensions.Conventions
  • 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”?我必须以某种方式注入内核吗?

I'm using:

  • EF 4.1
  • MVC 3
  • Ninject
  • Ninject.Extensions.Conventions
  • Ninject.Web.Mvc

The app uses the repository pattern.
My Repositories can be injected like this:

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

and it all works fine :-)

But i've neen attempting to go further with dynamically injecting from an asssembly like this in my 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>();
}

At run time the repository does get injected, but for some reason the entity never gets saved - perhaps because the repository can't tell if there are changes? or the unit of work is not maintained across the request?

My question is: How do i implement a "InRequestScope" when dynamically loading from assemblies? Do i have to somehow inject the kernel?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜是你 2024-11-16 22:05:18

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

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

This approach (marked ***) answers and solves the problem (copied from @John Barrett's comment):

kernel.Scan(a =>
  {
    a.FromAssembliesInPath(directoryInfo.FullName);
    a.AutoLoadModules();
    a.BindWithDefaultConventions();
    a.InRequestScope();  // <-- ***
  });
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文