gpt4 book ai didi

C# CSLA 业务对象困境 : read-only vs read/write

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:49 26 4
gpt4 key购买 nike

我所在的团队负责将我们旧的 VB6 UI/COBOL 数据库应用程序改造为现代。在我被录用之前,决定(主要是关于销售,我敢肯定)在数据库之前重做 UI。所以,现在我们使用 WPF 和 MVVM 取得了很好的效果,到目前为止效果非常好,尤其是使用 CSLA 作为我们的模型层。

但是,由于我们的开发与旧产品的下一版本同时进行,因此我们受到了一些限制。我们无法对对 COBOL 数据库的调用进行任何更改(或最小更改)。到目前为止这一切都很好,尽管如果您相信的话,可以回想起 SQL Server 的辉煌岁月。

关于我们的 BO 设计,我遇到了一个特别讨厌的障碍,那就是处理列表中返回的“轻型”业务对象及其“完整”对应物。让我尝试构建一个示例:

假设我们在数据库中有一个带有一堆字段的人对象。当我们对该表进行搜索时,我们不会返回所有字段,因此我们用这些填充我们的 lite 对象。这些字段可能是也可能不是完整人物的子集。我们可能已经做了一两次连接来检索一些特定于搜索的其他信息。但是,如果我们想要编辑我们的人物对象,我们必须再次调用以获取完整版本以填充 UI。这给我们留下了两个对象,并试图在 1 个 VM 中处理它们的状态,同时试图使人员列表在删除、编辑和添加后与其所在的任何父对象保持同步。最初,我让我们的 lite person 对象派生自 ReadOnlyBase<>。但是现在我正在处理与完整 BO 列表相同的列表行为,除了一半完整,一半精简版,我想我应该让精简版和完整版都派生自 BusinessBase< > 并简单地将精简版 setter 属性设为私有(private)。

有没有其他人遇到并找到了解决方案?在沉睡之后,我想出了这个潜在的解决方案。如果我们将 BO 的完整版和精简版包装在另一个 BO 中会怎样,如下所示:

public class PersonFull : BusinessBase<PersonFull>
{
...
}
public class PersonLite : BusinessBase<PersonLite>
{
...
}

public class Person : BusinessBase<Person>
{
public PersonFull PersonFull;
public PersonLite PersonLite;
}
public class PersonList : BusinessListBase<PersonList, Person>
{
}

显然,所有内容都是 CSLA 注册的属性等,但为了简洁起见,它们是那里的字段。在这种情况下,Person 和 PersonList 将包含所有工厂方法。在搜索操作之后,PersonList 将由 Person 对象填充,这些 PersonLite 成员都已填充,而 PersonFull 对象全部为空。如果我们需要获得完整版本,我们只需告诉 Person 对象这样做,现在我们有了 PersonFull 对象,所以我们可以填充编辑 UI。如果要删除 Person 对象,我们可以通过适当的 CSLA 删​​除过程轻松完成此操作,同时仍然保持列表在所有正在监听它的 VM 中的完整性。

所以,我希望这对每个人都有意义,如果有人有不同的解决方案,他们已经成功采用或批评这个解决方案,无论如何!

谢谢!

(转自:http://forums.lhotka.net/forums/thread/35576.aspx)

最佳答案

public class PersonLite : ReadOnlyBase<PersonLite>
{
public void Update(PersonFull person) { }
}

public class PersonFull : BusinessBase<PersonFull>
{
// blah blah
}

我会用对“完整”对象所做的更改来更新“精简版”对象,并将其保留为 ReadOnlyBase。重要的是要记住 ReadOnlyBase 中的“ReadOnly”是指只从数据库中读取的对象,并且永远不会保存到数据库中。一个不太优雅但更准确的名称是 NotSavableBase,因为这样的对象缺少 DataPortal_XYZ 机制,除了获取之外。由于显而易见的原因,此类对象通常具有不可变的属性,但它们并非必须如此。 ReadOnlyBase 派生自 Core.BindableBase 并实现了 INotifyPropertyChanged,因此更改其属性的值将与绑定(bind)一起正常工作。

当您保存“完整”对象时,您将新保存的实例传递给列表中实例的 Update(PersonFull) 方法,并更新“精简版”的属性来自“完整”对象的对象。

我已经多次使用这种技术并且效果很好。

关于C# CSLA 业务对象困境 : read-only vs read/write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1278697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com