首先在模型Repository MVC 4代码中验证会话变量

时间:2014-10-31 13:18:31

标签: c# asp.net-mvc-4 repository session-variables multiple-databases

我有多个数据库链接到同一个db上下文,我将保存在会话变量中的连接字符串传递给db上下文。为了使应用程序更健壮,我想验证会话变量是否为null。如果它为null,则将用户重定向到登录页面。

我似乎没有找到办法做到这一点。尝试传递连接字符串时,我经常在存储库中遇到错误。它永远不会到达错误处理部分。

我在这里做错了什么?

  

System.NullReferenceException:未将对象引用设置为对象的实例。

以下是我的代码。

的DbContext:

public class AppContext : DbContext
{
    public AppContext()
        : base()
    {

    }

    static AppContext()
    {
        Database.SetInitializer<AppContext>(null);
    }

    public AppContext(string connectionKey)
        : base("Name =" + connectionKey)
    {

    }

    public DbSet<App.Models.Contact> Contacts { get; set; }
}

模型回购:

public class ContactRepository : IContactRepository
{
    // Following line generates the error.
    AppContext context = new AppContext(Helpers.GetSessionKey("_ConnectionString").ToString());

    public IQueryable<Contacts> All
    {
        get { return context.Contacts; }
    }
}

帮手方法:

internal static class Helpers
{
    public static object GetSessionKey(string key)
    {
        if (HttpContext.Current.Session != null)
        {
            return HttpContext.Current.Session[key];
        }
        else {
            // This never fires.

            // Handle the error.
        }

    }
 }

1 个答案:

答案 0 :(得分:1)

您绝对不应该与存储库中的HttpContext进行交互。我很惊讶很久以前没有发生过你的事情。如果你的上下文需要Session的值,那很好,但是你应该在新的存储库/上下文时传入该值。例如:

public class ContactRepository : IContactRepository
{
    private readonly AppContext context;

    public ContactRepository(string connectionString)
    {
        context = new AppContext(connectionString);
    }

    ...

然后,在您的控制器中,您应该使用HttpContext之类的唯一地方,您可以执行以下操作:

var repo = new ContactRepository(Session["_ConnectionString"] ?? "Default Connection String Here");

这样,请求上下文就不会泄漏到您的数据层中。