您更喜欢搜索/报告DataTable或DTO或Domain Class?

时间:2008-12-25 13:34:30

标签: datatable domain-driven-design dto

我目前正在进行的项目需要大量的搜索/过滤页面。例如,我有一个复杂的搜索页面,可以按数据,类别,单位......来解决问题。

问题域类很复杂,包含许多值对象和子对象。

。我想知道人们如何处理UI的搜索/过滤/报告。据我所知,我有3个选择,但没有一个让我更开心。

1。)将参数发送到Repository / DAO以获取DataTable并将DataTable绑定到UI Controls.For ASP.NET GridView示例

DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();

在这个选项中,我可以简单地通过域层和查询数据库获取给定的规范。而且我不必完全构建复杂的域对象。不需要值对象,子对象,..直接从数据库中获取数据以显示在DataTable的UI中,并显示在UI中。

但是如果必须在UI中显示像方法返回值的计算字段,我必须在DataBase中执行此操作,因为我没有完全域对象。我必须复制逻辑和DataTable问题,如没有intellisense等......

2.)将参数发送到Repository / DAO以获取DTO并将DTO绑定到UI控件。

IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();

在此选项中与上面的相同,但我必须为每个搜索页面创建贫血的DTO对象。另外,对于不同的问题搜索页面,我必须显示问题对象的不同部分.IssueSearchDTO,CompanyIssueTO,MyIssueDTO ....

3.)将参数发送到Real Repository类以获得完全构造的域对象。

IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...

我喜欢领域驱动的设计和模式。此选项中没有DTO或复制逻辑。但是在此选项中,我必须创建很多未在UI中显示的子对象和值对象。还需要批次的ob连接才能获得针对子项的完整域对象和性能成本对象和值对象。

我不使用任何ORM工具也许我可以手动实现这个版本的Lazy Loading,但它看起来有点矫枉过正。

您更喜欢哪一个?或者我做错了吗?是否有任何建议或更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

我有一些建议,但当然整体答案是“它取决于”。

首先,您应该使用ORM工具,或者您应该有充分的理由不这样做。

其次,手动实现Lazy Loading相对简单,因此如果您不打算使用ORM工具,您只需在对象上创建类似以下内容的属性:

private Foo _foo;
public Foo Foo
{  
  get {  
         if(_foo == null)
         {
            _foo = _repository.Get(id);
         }
         return _foo;
       }
}

第三,性能是最初应该考虑的事情,但不应该让你远离优雅的设计。我认为你最初应该使用(3)并且如果它的性能不足则只偏离它。这导致编写最少量的代码并且在设计中具有最少的重复。

如果性能受到影响,您可以使用缓存和/或使用延迟加载的域层在UI层轻松解决。如果这两者都无法提供可接受的性能,那么您可以回退到DTO方法,在该方法中,您只传回所需的轻量级对象集合。

答案 1 :(得分:1)

这是伟大的问题,我也希望提供我的答案。我认为技术上最好的答案是选择#3。它提供了最佳描述和组织数据的能力以及可扩展性,以便将来增强报告/搜索请求。

然而虽然这可能是整体最佳选择,但IMO与其他(2)选项的成本相当高,这是支持所有类和关系所需的额外设计时间。报告需求(同样在没有使用ORM工具的前提下)。

我在很多应用程序中也很努力,现实情况是#2是时间和设计之间的最佳折衷。现在,如果你问的是你的商业对象及其所有需求,那么没有的问题是完全布局和正确设计的模型很重要,没有替代品。然而,当谈到报告和搜索时,这是一个不同的动物。 #2在贫血类中提供强类型数据,并不像#1这样的数据集中的硬编码值那么原始,与#3相比,仍然大大减少了完成设计所需的时间。

理想情况下,我希望扩展我的对象模型以涵盖所有报告需求,但有时需要付出的努力是如此广泛,以便为报告需求创建一组单独的类是一个更容易但仍然可行的选择。几年前我实际上问了几乎这个相同的问题,并且还被告知为报告需求创建另一组课程(基本上是DTO)并不是一个糟糕的选择。

总而言之,#3在技术上是最佳选择,但在考虑复杂报告和搜索需求的时间和质量时,#2可能是最现实和最可行的选择。