entity-framework – Ninject WebAPI由于DbContext已被处理,操作无法完成

前端之家收集整理的这篇文章主要介绍了entity-framework – Ninject WebAPI由于DbContext已被处理,操作无法完成前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我正在使用一个简单的仓库模式与属性和过滤器建议 here,因为我正在使用来自NuGet的Ninject.Web.WebApi-RC包.

这适用于第一个请求,但是由于我的DbContext在请求范围内,因此它会处理所有后续请求.

这是我的属性

  1. public class CommunicationKeyValidationAttribute : FilterAttribute
  2. {
  3. }

这是我的过滤器

  1. public class CommunicationKeyValidationFilter : AbstractActionFilter
  2. {
  3. public CommunicationKeyValidationFilter(IRepository repository)
  4. {
  5. this.repository = repository;
  6. }
  7. public override void OnActionExecuting(HttpActionContext actionContext)
  8. {
  9. // do stuff
  10. }
  11. }

这是我的存储库:

  1. public class Repository : IRepository
  2. {
  3. public Repository(MyDbContext dbContext)
  4. {
  5. this.dbContext = dbContext;
  6. }
  7. }

这是我的Ninject绑定:

  1. this.Kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
  2. this.Kernel.Bind<IRepository>().To<Repository>().InRequestScope();
  3. this.Kernel.BindHttpFilter<CommunicationKeyValidationFilter>(FilterScope.Action)
  4. .WhenActionMethodHas<CommunicationKeyValidationAttribute>()
  5. .InRequestScope();

我的控制器如下所示:

  1. public class HomeController
  2. {
  3. [CommunicationKeyValidation]
  4. public ActionResult Index()
  5. {
  6. // do stuff
  7. }

这里的问题是CommunicationKeyValidationFilter上的构造函数只在第一个请求中被调用.有没有办法,我可以使ninject在每次尝试解析过滤器时构造此过滤器?

解决方法

过滤器被WebApi高速缓存.它们应该处于临时范围,以便WebApi可以管理生命周期.由于长生命周期,您不能有任何具有较短生命周期的依赖关系.

您可以做的是在执行过滤器期间创建存储库.为此,最好使用NinjectFactoryExtension注入工厂:

  1. public class CommunicationKeyValidationFilter : AbstractActionFilter
  2. {
  3. public CommunicationKeyValidationFilter(IRepositoryFactory repositoryFactory)
  4. {
  5. this.repositoryFactory = repositoryFactory;
  6. }
  7.  
  8. public override void OnActionExecuting(HttpActionContext actionContext)
  9. {
  10. var repository = this.repositoryFactory.CreateRepository();
  11. }
  12. }
  13.  
  14. public interface IRepositoryFactory { IRepository CreateRepository(); }
  15. kernel.Bind<IRepositoryFactory>().ToFactory();

猜你在找的asp.Net相关文章