我很难解决我的问题。
我的 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 操作时,问题就开始了,然后上下文超出了范围。
有什么方法可以防止上下文超出范围并被处置?
另一个问题是过滤器。我使用 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,则此工作有效,但这会导致用户之间的“溢出”。感觉就像我错过了一些东西,并且有一些更好的方法可以做到这一点。
我希望有人对如何以不同的方式做到这一点有一些见解。