目前我的工作中的项目需要大量的searhing /过滤页面。比如我有一个COMLEX搜索页面度日的数据,类别,单位的问题,...

问题域类是复杂的并且包含大量的值对象和子对象。

。我想知道人们如何处理搜索/过滤/报告的UI。据我知道,我有3个选择,但他们都不让我更快乐。

1)发送参数给存储库/ DAO获取数据表和数据表绑定到UI Controls.For实施例到ASP.NET GridView的

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

在这个选项我可以简单地通过传递给定的规格领域层和查询数据库。而且我没有得到完全构造复杂的域对象。无需值对象,子对象,..获取的数据直接从UI数据库并显示在数据表中显示的UI。

但是,如果有必须证明在UI类似方法的返回值计算字段我必须这样做,在数据库中,因为我不完全具有域对象。我不得不重复一样,没有智能感知逻辑和DataTable问题等...

2)发送参数给存储库/ DAO获取DTO和绑定到DTO UI控件。

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

在此选项是相同像以上,但我要创建贫血DTO对象为每个搜索页面。也对于不同的文档版本搜索页面我必须表明问题的不同部分Objects.IssueSearchDTO,CompanyIssueTO,MyIssueDTO ....

3)发送参数给实时储存库类来获得完全构造域对象。

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

我喜欢领域驱动设计和图案。有一个在这个option.but在此选项中我要创建不会在UI.Also出儿童和值对象的大量的没有DTO或重逻辑它需要很多的OB加入得到充分的领域对象和性能成本针的孩子对象和值的对象。

我不使用任何ORM工具也许我可以手工实现延迟加载这个版本,但它似乎有点矫枉过正。

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

有帮助吗?

解决方案

我有几个建议,当然整体的答案是“看情况”。

首先,你应该使用ORM工具或应该有一个很好的理由不这样做。

二,由专人实施延迟加载相对简单,所以在你不打算使用ORM工具的情况下,你可以简单地创建一个这样说你的对象的属性:

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

三,性能是应该被最初考虑,但不应从优雅的设计,你赶跑。我认为你应该使用(3)开始,如果它的性能是不够的只是偏离它。这导致编写代码量最少的,并具有在设计中至少重复。

如果性能会受到影响,你可以在UI层使用延迟加载使用缓存和/或在域层容易解决这个问题。如果这些均不能提供可接受的性能,则可以回退到DTO的方法,其中只传回所需的值对象的轻质集。

其他提示

这是一个的伟大的问题,我想提供我的回答也是如此。我认为的技术上最好的的回答是去与选项#3。它提供了最好的说明,并与可扩展性进一步增强其报告/搜索请求一起组织数据的能力。

然而的,而这可能是整个最好的选择,有一个巨大的成本IMO与其他(2)选项,这些选项是额外的设计时间支持所需的所有类和关系(前提是没有ORM工具被使用下再次)报告需求。

我这个在我的很多应用斗争以及与现实是,#2是时间和设计之间的最佳平衡。现在,如果你问你的busniess对象和他们的需求有的问题,一个完全放出来,设计合理的模型是非常重要的,没有替代品。然而,当谈到报告和搜索这对我来说是一个不同的动物。 #2提供了强类型的贫血类数据,而不是硬编码为值作为原始的数据集在如#1,并且还大大降低了比#3完成设计所需要的时间量。

理想我很乐意延长我的对象模型,以涵盖所有的报告需求,但有时这样做所需要的努力是如此地广泛,只是用于报告需要创建一个独立的组类是更容易,但还是可行的选择。我居然问这几乎相同的问题,几年前和也被告知,创建报告需要另一组类(主要是DTO的)是个不错的选择。

所以,把它包起来,3号在技术上是最好的选择,但对于复杂的报告和搜索需要考虑时间和质量在一起时,#2可能是最现实,最可行的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top