Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何持久化业务层可用的会话数据_C#_Asp.net_Persistence - Fatal编程技术网

C# 如何持久化业务层可用的会话数据

C# 如何持久化业务层可用的会话数据,c#,asp.net,persistence,C#,Asp.net,Persistence,我正在构建一个ASP.NETMVC4应用程序。用户必须登录,并根据数据库检查帐户。在此数据库中,用户与一个或多个部门关联。需求说明用户一次只能为一个部门使用该应用程序 这意味着在成功登录后,我会检查用户链接到多少个部门。如果这只是一个,它将是活动部门。如果不止一个,我会要求用户选择其中一个,这个选择将是活动部门。此值必须在整个会话中保持不变 应用程序中有许多用例必须只允许访问属于活动部门的数据。这些限制适用于业务层,即不了解ASP.Net上下文的C#类库 如何最好地保留用户对活动部门的选择?我不

我正在构建一个ASP.NETMVC4应用程序。用户必须登录,并根据数据库检查帐户。在此数据库中,用户与一个或多个部门关联。需求说明用户一次只能为一个部门使用该应用程序

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

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

如何最好地保留用户对活动部门的选择?我不太喜欢将其存储在de数据库中的想法,因为它不会在会话之外持久化。另一方面,在我的业务层中,我找不到任何现成的持久性配置。我的ASP.net应用程序提供了一个会话,但这些会话对于业务层是不可见的

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


还有更好的选择吗

可以在会话变量中存储活动部门:

会话[“活动部门”]=1

在业务逻辑中不需要会话管理。围绕业务逻辑程序集编写一个包装器,该包装器需要为所有调用提供ActiveDepartmentID才能有效。包装器始终返回按ActiveDepartmentID筛选的数据


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

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

实际上,您可以从类库访问会话。您需要做的是参考
System.Web
,然后:

1) 在代码中导入名称空间

2)
var sessionValue=HttpContext.Current.Session[“ActiveDepartment”]


或者,您可以在每次需要时将
ActiveDepartment
传递给您的业务层,而不是从会话中获取,这样您就不必绑定到web应用程序了

这些对于业务层是不可见的吗?你是什么意思?我的意思是BL类库没有对Web应用程序项目的引用。然而,我现在看到它是不需要的。事实上,让我惊讶的是,它居然能起作用。我通过在控制器的会话属性中存储一个值并在随后的请求中从业务层中的HttpContext.Current.Session检索该值来测试这一点。我假设只有在web应用程序上下文中加载BL程序集时,这才有效。我选择这个作为答案,因为它提供了更好的选择。我不喜欢BL项目中对System.Web的引用。