我们正在使用ASP.NET MVC,Entity Framework Code First和即将发布的SQL Azure Federations构建多租户数据库应用程序。我们的存储库接受DbContext作为使用Ninject注入的构造函数参数。问题在于DbContext有一个int构造函数参数来指定将用于对该上下文发出的请求的帐户ID。像这样:

public class DatabaseContext : DbContext
{
     public DatabaseContext(int accountId)
     {
          // Code here to ensure we only work with data associated with
          // the account identified by accountId
     }
}


帐户ID的值将存储在会话变量中。问题是,当Ninject创建DatabaseContext的新实例时,如何使Ninject将Session中的值注入到构造函数中?

还是有另一种方法应该将帐户ID注入DbContext?

最佳答案

有几种方法。我喜欢使用.ToMethod方法。

Bind<DatabaseContext>().ToMethod(
    c => new DatabaseContext((int)HttpContext.Current.Session["Acct"]);


尽管可以解决此特定问题,但我发现创建一个具有基于会话数据的ISessionManager服务更好。任何想要的内容,例如accountId都可以将此服务注入到构造函数中,并在需要帐户ID时访问其AccountId属性。

10-06 00:40