2013-03-12 57 views
2

我正在构建一个ASP.Net MVC 4应用程序。用户必须登录并根据数据库检查帐户。在这个数据库中,用户被关联到一个或多个部门。用户拥有的需求状态一次只能为一个部门使用该应用程序。如何保留会话数据,可用于业务层

这意味着成功登录后,我会检查用户链接的部门数量。如果这只是一个,它将是活跃的部门。如果它不止一个,我会要求用户选择其中一个,这个选择将是活跃的部门。该值必须在整个会话中保持不变。

应用程序中有很多用例只能访问属于活动部门的数据。这些限制适用于业务层,即不知道ASP.Net上下文的C#类库。

我该如何最好地坚持用户对活动部门的选择?我不喜欢把它存储在数据库中的想法,因为它不会在会话之后持续存在。另一方面,在我的业务层中,我找不到任何开箱即用的持久性配置。我的ASP.net应用程序提供了一个会话,但这些对于业务层来说是不可见的。

我是否应该将此值存储在会话中并使用AuthenticateRequest事件或类似的东西将活动部门传递给业务层?

有没有更好的选择?

+0

这些对于业务层是不可见的?你什么意思? – codingbiz 2013-03-12 16:33:40

回答

2

存放活跃部门可以在会话变量来实现:

Session["ActiveDepartment"] = 1

你不需要会话管理你的业务逻辑。在业务逻辑程序集中编写一个包装器,要求为所有调用提供ActiveDepartmentID才能生效。包装器总是返回由ActiveDepartmentID过滤的数据。

由于这是一个MVC应用程序,因此您可以通过在所有控制器操作中要求ActiveDepartmentID来在Controller级执行此操作。

+1

我选择这个作为答案,因为它提供了一个更好的选择。我不喜欢我的BL项目中对System.Web的引用。 – 2013-03-12 22:22:21

3

这些对于业务层是不可见的?你什么意思?

您实际上可以从类库访问您的会话。你所要做的就是参考System.Web则:

1)导入命名空间在代码

2)var sessionValue = HttpContext.Current.Session["ActiveDepartment"];

或者,您也可以在每次你需要它,而不是时间通过ActiveDepartment到业务层从会话中获取它,因此您不会绑定到Web应用程序

+0

我的意思是不可见的BL类库没有对Web应用程序项目的引用。但是,我现在看到它不是必需的。 – 2013-03-12 22:09:40

+0

事实上,这令我感到惊讶,它可以工作。我通过将值存储在Controller的Session属性中并在业务层中的HttpContext.Current.Session的后续请求中检索该值。我认为这只会在BL程序集加载到Web应用程序上下文中时才起作用。 – 2013-03-12 22:20:02