【问题标题】:Reloading child BusinessListBase object inside a parent ReadOnlyBase object on database update在数据库更新时重新加载父 ReadOnlyBase 对象内的子 BusinessListBase 对象
【发布时间】:2022-08-05 02:23:24
【问题描述】:

我对 CSLA 非常陌生,并且被要求修复使用 CSLA 的遗留代码中的错误。我正面临以下问题,

我们的微服务在第一次调用期间加载了一个 ReadOnlyBase,我假设它在那之后将所有数据缓存在内存中。另一个微服务直接更新数据库。如何强制刷新子对象?我们确实有一个通知服务来通知数据库的更改(我可以知道哪个是相应的 CSLA 对象)但我不知道该怎么做?

以下是示例代码,

public class C : BusinessBase<C>
    {
        public int Id { get; set; }
        public string Value { get; set; }
        public bool IsActive { get; set; }
    }

    public class CList : BusinessListBase<CList, C>
    {
        
    }

    public class B : ReadOnlyBase<B>
    {
        public CList Cs
        {
            get;set;
        }
    }


    public class A : ReadOnlyBase<A>
    {
        public B Games
        {
            get; set;
        }
    }

    标签: csla


    【解决方案1】:

    在大多数情况下,服务是无状态的,因此在服务调用之间不维护任何数据。

    因此,如果您的第一个服务将 A/B/C 数据返回给客户端,那么只有客户端将拥有该状态数据。

    大概客户端然后调用第二个服务,将数据发送到该服务。第二个服务将需要使用该数据来加载带有数据的业务对象图,然后使用 CSLA 数据门户保存它。

    您无法保存 ReadOnlyBase 中的数据 - 该类型的域对象是只读的。所以只能保存 C 数据,因为那是一个读写域对象。

    回到只读的 A 和 B 类型。这些可能被缓存在服务器上,但如果它们是你的应用程序中的代码。 CSLA 本身不做任何缓存。

    缓存只读对象的一种常见方法是使用工厂方法来获取对象,并且在该工厂方法中有访问缓存的代码。

    简单来说,它可能是这样的伪代码:

    public static async Task<B> GetBAsync(IDataPortal<B> portal)
    {
      var result = HttpContext.Session["BCache"];
      if (result == null)
      {
        result = await portal.FetchAsync();
        HttpContext.Session["BCache"] = result;
      }
      return result;
    }
    

    缓存可能是静态字段、会话、REDIS 或您选择的任何内容。

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多