MVC ninject dbcontext

时间:2013-10-23 09:08:49

标签: c# entity-framework asp.net-mvc-4 ninject

我在解决我的问题时遇到了麻烦。

我的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,但这会导致用户之间的“流血”。感觉就像我错过了一些东西,还有一些更好的方法可以做到这一点。

我希望有人能够对如何以不同方式做到这一点有所了解。

0 个答案:

没有答案