我在解决我的问题时遇到了麻烦。
我的MVC应用程序为不同的客户端使用了许多单独的数据库(不要问。)。 我正在使用Ninject在请求的基础上将DbContext注入服务和控制器,如下所示:
var ContextFactory = new Func<MyContext>(() => {
var client = UserProfile.GetProfile()
.SelectedCompany.Features.OfType<feature_Client>()
.FirstOrDefault();
if(client == null)
return (DbContext)null;
return new MyContext(client.ConnectionString);
});
Bind<MyContext>().ToMethod(x => ContextFactory ()).InRequestScope();
这很好用。问题开始于我有一个长时间运行的任务,我在一个单独的线程上运行并直接返回MVC Action,然后上下文超出了范围。
有没有办法阻止上下文超出范围并被忽视?
另一个问题是过滤器。我使用ActionFilter来检查用户是否有权访问某个特定的函数,但这是一些如何不在请求上下文中,所以我不能注入正确的dbcontext,过滤器看起来像这样:
public class AccessFilterAttribute : ActionFilterAttribute
{
private MyContext Context;
public RightsEnum AccessMask { get; set; }
public AccessFilterAttribute()
: this(DependencyResolver.Current.GetService(typeof(MyContext)) as MyContext)
{
}
public AttestAccessFilterAttribute(MyContext Context)
{
this.Context= Context;
}
这项工作如果将InRequestScope更改为例如ThreadScope,但这会导致用户之间的“流血”。感觉就像我错过了一些东西,还有一些更好的方法可以做到这一点。
我希望有人能够对如何以不同方式做到这一点有所了解。