0

我正在做的项目是使用 n 层架构。我们的层如下:

  • 数据访问
  • 商业逻辑
  • 商业实体
  • 介绍

Business Logic 向下调用到数据访问层,Presentation 层向下调用到 Business Logic 层,业务实体都被它们引用。

我们的业务实体与我们的数据模型 1-1 基本匹配。对于每张桌子,我们都有一个班级。最初设计框架时,没有考虑管理主从关系或子父关系。所以所有的业务逻辑、数据访问和业务实体,都只引用了数据库中的一个表。一旦我们开始开发应用程序,很快就会发现在我们的对象模型中没有这些关系会严重伤害我们。

您的所有层(包括数据库)都是从内部元数据数据库生成的,我们用它来驱动我们自己开发的代码生成器。

问题是在我们的实体中加载或延迟加载关系的最佳方式是什么。例如,假设我们有一个与地址表具有主子关系的人员类。这在业务实体中显示为 Person 对象上 Addresses 的集合属性。如果我们有一对一的关系,那么这将显示为单个实体属性。填充和保存关系对象的最佳方法是什么?我们的业务实体不了解业务逻辑层,因此在调用属性 get 时无法在内部完成。

我敢肯定有某种标准模式可以做到这一点。有什么建议么?

此外,需要注意的一点是 DataAcess 层使用反射来构建我们的实体。存储过程基于一张表返回一个结果选择,并使用反射通过将属性名称与列名称匹配来填充我们的业务对象。所以做连接会很困难。

4

3 回答 3

2

我强烈建议您查看 Fowler 的企业架构模式一书。他很好地概述了解决这类问题的几种不同方法,包括实体关系。

更引人注目的项目之一是工作单元模式,它基本上是一个收集器,它观察在您的实体上执行的操作,一旦您完成了您的操作,它会批处理适当的数据库调用,并向数据库。这种模式是NHibernate使用的核心概念之一,它使用一个实现 IDisposable 的对象来表示“工作”的结束。这允许您将您的操作包装在一个 using 中,并让工作单元为您处理这些操作。

编辑:附加信息

是与工作单元的基本类结构的链接……这并不是世界上最令人兴奋的事情。Fowler 在他的书中提供了更多细节,您可以在此处查看其中的一些细节。您还可以将 NHibernate 中的 Session 对象视为可能的实现(我能够追踪ISession接口......不确定实现的位置)

希望这可以帮助。

于 2008-10-01T02:17:28.703 回答
1

我过去使用的一种方法是使容器类型足够智能以获取所需的对象。例如:

public class Relation<T>
{
  private T _value;

  private void FetchData()
  {
    if( LoadData != null ) {
      LoadDataEventArgs args = new LoadDataEventArgs(typeof(T), /* magic to get correct object */);
      LoadData(this, args);
      _value = (T)args.Value;
    }
  }

  public event EventHandler<LoadDataEventArgs> LoadData;

  public T Value {
    get {
      if( _value == default(T) )
        FetchData();
      return _value; 
    }
    set { /* Do magic here. */ }
  }
}

然后你在你的实体上声明它,比如:

[RelationCriteria("ID", EqualsMyProperty="AddressID")]
public Relation<Address> Address {
  get; set;
}

并且由声明 Address 属性的类型的加载程序来为 LoadData 事件添加处理程序。

一个类似的类实现了 IList 来为您提供一对多的关系。

于 2008-10-01T02:16:39.737 回答
0

您使用什么语言?您所描述的正是实体框架在.Net 中所做的。但是您没有分享您使用的语言,我假设您不想重写任何数据层。

于 2008-10-01T01:59:22.430 回答