0

我很难解决我的问题。

我的 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,则此工作有效,但这会导致用户之间的“溢出”。感觉就像我错过了一些东西,并且有一些更好的方法可以做到这一点。

我希望有人对如何以不同的方式做到这一点有一些见解。

4

0 回答 0