Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# 如何在控制器中创建不可变的BusinessLayer而不更改其属性?_C#_Asp.net_.net_Asp.net Mvc_Session - Fatal编程技术网

C# 如何在控制器中创建不可变的BusinessLayer而不更改其属性?

C# 如何在控制器中创建不可变的BusinessLayer而不更改其属性?,c#,asp.net,.net,asp.net-mvc,session,C#,Asp.net,.net,Asp.net Mvc,Session,我有BusinessLayer,它包含旧桌面应用程序中的集合和可重用代码 现在我想在MVC应用程序中再次使用此层。 我尝试使用控制器中的层,例如Index() 现在我想保留我在第一个视图中添加的表。并使其在下一篇文章中保持不变。我使用了会话。我不知道是否应该使用ViewBag或ViewData 简而言之:我应该遵循哪种模式来创建不可变的BusinessLayer 因为每次发生回发时,我不需要一次又一次地获取表信息、键或逻辑本身 于2019/04/14更新 我是否应该将整个BusinessLogi

我有BusinessLayer,它包含旧桌面应用程序中的集合和可重用代码

现在我想在MVC应用程序中再次使用此层。 我尝试使用控制器中的层,例如Index()

现在我想保留我在第一个视图中添加的表。并使其在下一篇文章中保持不变。我使用了会话。我不知道是否应该使用ViewBag或ViewData

简而言之:我应该遵循哪种模式来创建不可变的BusinessLayer

因为每次发生回发时,我不需要一次又一次地获取表信息、键或逻辑本身

于2019/04/14更新

我是否应该将整个BusinessLogic属性和集合替换到此模式

在Windows应用程序中:

pulic class EntryLogic{
   public List<Table> Tables{get;set;}
}

首先,我不认为你想在索引上使用图层,而是在应用程序启动时使用图层。另外,如果您要使用会话,这意味着每个用户将有一组不同的表

归结起来是:

  • 每个用户的集合是否相同? 如果是,则您希望在应用程序启动中初始化它们
  • 还有静态变量也是一样的。通过使用静态变量,它将在所有操作和用户之间共享
  • 如果每个用户都有一组不同的表和键,并且它们是不同的,那么yes会话可以用来存储您想要的任何变量
此外:

  • ViewBagViewData是相同的。你可以用任何一种
这是包含集合的静态类

这是初始化和填充集合的地方

这就是你如何使用你的集合来控制控制器


首先,我认为您不想在索引上使用图层,而是在应用程序启动时使用图层。另外,如果您要使用会话,这意味着每个用户将有一组不同的表

归结起来是:

  • 每个用户的集合是否相同? 如果是,则您希望在应用程序启动中初始化它们
  • 还有静态变量也是一样的。通过使用静态变量,它将在所有操作和用户之间共享
  • 如果每个用户都有一组不同的表和键,并且它们是不同的,那么yes会话可以用来存储您想要的任何变量
此外:

  • ViewBagViewData是相同的。你可以用任何一种
这是包含集合的静态类

这是初始化和填充集合的地方

这就是你如何使用你的集合来控制控制器


在我看来,您可以使用缓存来减少对数据库的调用,而不用担心保留状态。

在我看来,您可以使用缓存来减少对数据库的调用,而不用担心保留状态。

好的。我是否应该重写条目LogicLayer并将集合替换为会话[“collection”],并将所有变量替换为该模式?或者只是在会话状态本身中添加LogicLayer实例?EntryLogic不能更改,并且对所有用户都相同。以及整个应用程序。它必须看起来像windows应用程序。然后您将创建一个静态类来保存这些集合,该静态类将在应用程序启动时初始化。如果您使用会话,那么每个用户都会显示相同的集合。我不需要创建更多内容。它已经创建了。但业务逻辑本身就是一个类。阅读上述更新的问题。每个视图都有自己的EntryLogic类实例,其中包含表定义Show它是创建的吗?显然不是这样,否则您就不会像看上去那样再次初始化。此外,每个用户的会话也不同。会议是不可能的。如果您有100个项目和1000个用户,那么最终您将拥有数量为100*1000的项目。您提供的代码没有初始化任何内容或正在创建任何内容。没有数据。好的。我是否应该重写条目LogicLayer并将集合替换为会话[“collection”],并将所有变量替换为该模式?或者只是在会话状态本身中添加LogicLayer实例?EntryLogic不能更改,并且对所有用户都相同。以及整个应用程序。它必须看起来像windows应用程序。然后您将创建一个静态类来保存这些集合,该静态类将在应用程序启动时初始化。如果您使用会话,那么每个用户都会显示相同的集合。我不需要创建更多内容。它已经创建了。但业务逻辑本身就是一个类。阅读上述更新的问题。每个视图都有自己的EntryLogic类实例,其中包含表定义Show它是创建的吗?显然不是这样,否则您就不会像看上去那样再次初始化。此外,每个用户的会话也不同。会议是不可能的。如果您有100个项目和1000个用户,那么最终您将拥有数量为100*1000的项目。您提供的代码没有初始化任何内容或正在创建任何内容。没有数据。Session和ViewBag不是执行此工作的好工具。对于一个快速简单的解决方案,你可以使用“单例”模式。我更新了问题以增加更多的分数。我不知道哪一种是好模式?将整个图层特性转换为会话或仅添加该图层的会话并使用特性directlySession和ViewBag不是执行此工作的好工具。对于一个快速简单的解决方案,你可以使用“单例”模式。我更新了问题以增加更多的分数。我不知道哪一种是好模式?将整个图层特性转换为会话,或仅添加该图层的会话并直接使用特性
pulic class EntryLogic{
   public List<Table> Tables{get;set;}
}
public class EntryLogic{
  public List<Table> Tables{
    get{
           if(Session["Tables"] == null)
              Session["Tables"] = new List<Table>();
           return Session["Tables"] as List<Table>;
      }
    set { Session["Tables"] = value;}
  }
}
var EntryLogic = Session["EntryLogic"] as EntryLogic;