gpt4 book ai didi

entity-framework - Ninject WebAPI 操作无法完成,因为 DbContext 已被释放

转载 作者:行者123 更新时间:2023-12-04 03:16:10 25 4
gpt4 key购买 nike

因此,我使用了一个简单的存储库模式,其中包含推荐的属性和过滤器 here因为我使用的是 Ninject.Web.WebApi-RC来自 NuGet 的包。

这适用于第一个请求,但因为我有我的 DbContext在请求范围内,它被处理在所有后续请求中。

这是我的属性:

public class CommunicationKeyValidationAttribute : FilterAttribute
{
}

这是我的过滤器:
public class CommunicationKeyValidationFilter : AbstractActionFilter
{
public CommunicationKeyValidationFilter(IRepository repository)
{
this.repository = repository;
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
// do stuff
}
}

这是我的存储库:
public class Repository : IRepository
{
public Repository(MyDbContext dbContext)
{
this.dbContext = dbContext;
}
}

这是我的 Ninject 绑定(bind):
this.Kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
this.Kernel.Bind<IRepository>().To<Repository>().InRequestScope();
this.Kernel.BindHttpFilter<CommunicationKeyValidationFilter>(FilterScope.Action)
.WhenActionMethodHas<CommunicationKeyValidationAttribute>()
.InRequestScope();

我的 Controller 如下所示:
public class HomeController 
{
[CommunicationKeyValidation]
public ActionResult Index()
{
// do stuff
}

这里的问题是 CommunicationKeyValidationFilter 上的构造函数仅在第一个请求时被调用。有没有一种方法可以让 ninject 每次尝试解析过滤器时都构造这个过滤器?

最佳答案

过滤器由 WebApi 缓存。它们应该在 transient 范围内,以便 WebApi 可以管理生命周期。由于生命周期长,您不能拥有任何生命周期较短的依赖项。

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

public class CommunicationKeyValidationFilter : AbstractActionFilter
{
public CommunicationKeyValidationFilter(IRepositoryFactory repositoryFactory)
{
this.repositoryFactory = repositoryFactory;
}

public override void OnActionExecuting(HttpActionContext actionContext)
{
var repository = this.repositoryFactory.CreateRepository();
}
}

public interface IRepositoryFactory { IRepository CreateRepository(); }
kernel.Bind<IRepositoryFactory>().ToFactory();

关于entity-framework - Ninject WebAPI 操作无法完成,因为 DbContext 已被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com