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

标签 c# business-objects csla readonly read-write

我所在的团队负责将旧的 VB6 UI/COBOL 数据库应用程序改造为现代版本。在我被聘用之前,我决定(我确信主要是出于销售考虑)在数据库之前重做用户界面。所以,现在我们使用 WPF 和 MVVM 取得了很好的效果,到目前为止,这真是令人惊叹,特别是使用 CSLA 作为我们的模型层。

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

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

假设数据库中有一个包含一堆字段的人员对象。当我们对该表进行搜索时,我们不会返回所有字段,因此我们用这些字段填充我们的精简对象。这些字段可能是也可能不是完整人员的子集。我们可能已经进行了一两次连接来检索特定于搜索的其他一些信息。但是,如果我们想要编辑 person 对象,我们必须再次调用以获取完整版本来填充 UI。这给我们留下了两个对象,并试图在 1 个虚拟机中调整它们的状态,同时在删除、编辑和添加后尝试使其所在的任何父对象上的人员列表保持同步。最初,我让我们的精简版对象派生自 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 对象全部为 null。如果我们需要获取完整版本,我们只需告诉 Person 对象即可,现在我们有了 PersonFull 对象,因此我们可以填充编辑 UI。如果要删除 Person 对象,我们可以使用适当的 CSLA 删​​除过程轻松地完成此操作,同时仍然保持所有正在监听它的虚拟机的列表的完整性。

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

谢谢!

(转发自: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) 方法,并更新“lite”的属性来自“完整”对象的对象。

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

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

相关文章:

java - 在哪里可以获得 Crystal Reports java API 的 javadoc

.net - 你如何测试你的业务对象?

c# - CSLA .NET - Child_Fetch 未按预期工作

c# - 从 Accelerometer.ReadingChanged 调用 NavigationService.Navigate 会抛出 NotSupportedException

sql - 为什么临时表有效,而永久表无效?

excel - 如何在 WebI 中从 Excel 或 CSV 文件加载提示值?

c# - MSDTC 是一个很大的资源消耗吗?

c# - 如何使用 xamarin.ios 创建圆形脉冲动画?

c# - 陷入无限循环

c# - 在行命令中获取 Gridview 的内容