如何在Controller中创建不可变的BusinessLayer而不更改其属性?

问题描述 投票:1回答:2

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

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

public ActionResult Index()
{
    if (Session["DataEntryLogic"] == null)
        Session["DataEntryLogic"] = new DataEntryLogic();

    var EntryLogic = Session["DataEntryLogic"] as DataEntryLogic;

    EntryLogic.Tables.Add(new Table());
    EntryLogic.Tables[0].TableID = "AccTransHed";
    EntryLogic.Tables[0].TableType = TableType.Master;
}

现在我想保留我在第一个View加载中添加的表。并使其在下一个回发中不可变。我用了Session。我不知道是否应该使用ViewBag或ViewData。

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

因为每次发生回发事件都不需要一次又一次地获取表信息或密钥或逻辑本身。

更新时间为2019/04/14

我应该将整个BusinessLogic属性和集合替换为此模式吗?

在Windows应用程序中:

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

到MVC应用程序:

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;}
  }
}

或者只是在会话变量中初始化桌面应用程序的EntryLogic实例?

var EntryLogic = Session["EntryLogic"] as EntryLogic;
c# asp.net .net asp.net-mvc session
2个回答
0
投票

对我来说,听起来你可以使用缓存来减少对数据库的调用,而不用担心保留状态。


0
投票

首先,我不认为你想在索引上使用图层但是在app start上。此外,如果您要使用Session,这意味着每个用户将拥有一组不同的表。

归结为:

  • 每个用户的集合是否相同?如果是,那么你想在app start中初始化它们
  • 具有静态变量也是一样的。通过使用静态变量,它将在所有操作和用户之间共享。
  • 如果每个用户都有一组不同的表和键,并且它们是不同的,则可以使用“会话”来存储您想要的任何变量。

也:

  • ViewBag和ViewData是相同的。你可以使用其中之一。

这是你带集合的静态类

enter image description here

这是您初始化和填充集合的位置

enter image description here

这就是你如何将你的收藏品用于控制器。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.