【问题标题】:How to make an immutable BusinessLayer in Controller without change its properties?如何在不更改其属性的情况下在 Controller 中制作不可变的 BusinessLayer?
【发布时间】:2019-09-04 14:25:02
【问题描述】:

我有一个 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;
}

现在我想保留我在第一个视图加载中添加的表。并使其在下一个 post-backs 中不可变。我使用了会话。我不知道应该改用 ViewBag 还是 ViewData。

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

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

2019 年 4 月 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;

【问题讨论】:

  • Session 和 ViewBag 不是完成此类工作的好工具。对于快速简单的解决方案,您可以使用“Singleton”模式。
  • 我更新了问题以添加更多积分。不知道哪个模式好?将整个图层属性转换为会话,或者只添加该图层的会话并直接使用属性

标签: c# asp.net .net asp.net-mvc session


【解决方案1】:

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

归结为:

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

还有:

  • ViewBagViewData 是一样的。您可以使用任何一种。

这是你的静态类与集合

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

这就是你如何将你的集合用于控制器。

【讨论】:

  • 好的。我应该重写条目 LogicLayer 并将集合替换为 Session["Collection"] 并将所有变量替换为此模式吗?还是只是在 Session 状态本身中添加 LogicLayer Instance?
  • EntryLogic 不得更改,并且对所有用户都相同。并适用于整个应用程序。它必须看起来像 windows 应用程序。
  • 然后您将创建一个静态类来保存这些集合,该静态类将在应用程序启动时初始化。如果您使用会话,那么每个用户都会出现相同的集合。
  • 我不需要创造更多的东西。它已经创建。但 BusinessLogic 本身就是一个类。阅读上面有问题的更新。每个视图都有自己的 EntryLogic 类实例,其中包含表定义
  • 它是如何创建的?显然不是,否则您将不会像看起来那样再次初始化。每个用户的会话也不同。会话是不行的。如果你有 100 个项目和 1000 个用户,那么你最终会得到一些项目 = 100*1000。您提供的代码不会初始化任何东西或创建任何东西。没有数据。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2020-11-24
    • 2012-01-28
    • 2019-08-25
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多