商业实体加载模式

时间:2008-10-01 01:55:00

标签: .net vb.net n-tier-architecture

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

  • 数据访问
  • 商业逻辑
  • 商业实体
  • 演示

业务逻辑调用数据访问层,表示层调用业务逻辑层,所有业务实体都引用业务实体。

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

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

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

我确信这样做有某种标准模式。有什么建议吗?

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

3 个答案:

答案 0 :(得分:2)

我强烈推荐查看福勒的Patterns of Enterprise Architecture书。解决这类问题有几种不同的方法可以很好地概括,包括实体关系。

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

编辑:附加信息

This是工作单元基本课程结构的链接......这并不是世界上最令人兴奋的事情。福勒在他的书中提供了更多细节,其中一些你可以看到here。您还可以将NHibernate中的Session对象看作可能的实现(我能够跟踪ISession接口......不确定实现的位置)

希望这有帮助。

答案 1 :(得分: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以提供一对多的关系。

答案 2 :(得分:0)

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