0

我在 JCProperty 类中使​​用以下代码从 DAL 检索数据:

Dim x As JCProperty
        x = JCPropertyDB.GetProperty(PropertyID)

        If Not x Is Nothing Then
            Me.PropertyID = x.PropertyID
            Me.AddressLine1 = x.AddressLine1
            Me.AddressLine2 = x.AddressLine2
            Me.AddressLine3 = x.AddressLine3
            Me.AddressCity = x.AddressCity
            Me.AddressCounty = x.AddressCounty
            Me.AddressPostcode = x.AddressPostcode
            Me.TelNo = x.TelNo
            Me.UpdatedOn = x.UpdatedOn
            Me.CreatedOn = x.CreatedOn
            Me.Description = x.Description
            Me.GUID = x.GUID
        End If

这工作正常,但需要 DAL 对象 (JCPropertyDB) 知道业务对象 (JCProperty),并且我有效地创建和填充相同的对象两次(一次在 DAL 中返回到 BL,然后再次在 BL 对象中填充本身)。

我在这里遗漏了一些东西,我知道一定有更好的方法!

实际上,我需要分配不允许的“Me = x”。有人可以让我直截了当吗?

4

5 回答 5

4

您在正确的路线上,但是略微丢失了一点。

通常,您的数据访问层 (DAL) 会从您的数据库返回数据传输对象(DTO)。这些是普通旧 CLR 对象 (POCO),不包含业务逻辑,只是或多或少映射到数据库表的属性。

然后,您将拥有从这些 DTO 创建域模型的代码,称为Data Mapper。领域模型中的类可能具有相似的名称(即 CustomerDTO -> Customer),但除了数据之外,它们还将包含验证规则和可能的其他业务逻辑。

然后您在业务层中使用的正是这个领域模型,而不是实际的 DTO。这意味着如果您更改从 DAL 返回的 DTO(即通过实施新的 ORM 工具),您只需修改您的数据映射器,前提是数据模型保持不变。

我建议查看Martin Fowler 的企业应用程序架构模式以了解数据访问模式。

于 2008-10-14T08:12:54.930 回答
2

不确定这是否会回答您的问题,但重要的是域模型独立于显示和存储。这通常被称为关注点分离。这个想法是获得松散耦合并创建一个简单的系统,其中对象没有几个完全不同的职责。
所以我要做的是允许 DAL 直接创建业务对象,但要确保我的业务对象不会被与 DAL 相关的任何东西污染。同样,我不想用特定于 UI 的东西(如 HTML)来污染它们。在我看来,业务层、DAL 和 UI 层都对域模型有依赖关系是可以的,但是从域模型和这些其他组件中具有依赖关系是不行的。
要放松耦合,使用 Spring 或任何其他依赖注入容器以及接口和接线可以帮助您。
通过在每一层中重新创建相同的对象,您违反了 DRY 原则(不要重复自己),并且您正在引入样板代码并增加在某处引入错误的机会。

于 2008-10-11T16:05:47.207 回答
1

就个人而言,我很懒。我通常会做类似的事情:

class JCProperty : inherits JCPropertyDB
   {

   New()
      {
      MyBase.New()

      GetProperty(PropertyID)

      }
   }

然后你基本上完成了,直到你在 JCProperty 类中有一些额外的功能需要发生在 JCPropertyDB 中已经存在的功能的“顶部”。然后覆盖 JCPropertyDB 方法以首先调用基本方法,然后添加新功能。

罗恩

于 2008-10-11T16:23:14.613 回答
0

查看: http: //www.icemanind.com/layergen.aspx

于 2009-09-29T20:49:11.653 回答
0

我一直在通过桥接模式和提供者模型接收 BO 并从 DAL 中发回 BO。我看不到 DTO 的意义,除非我害怕大量的序列化(比如 Web 服务或 JSON)。我的方法是通过接口抽象数据层和业务层,并提供一个匿名数据层馈入业务对象。这意味着我可以插入任何数据层,实现一个具有通用加载和保存方法的接口,然后可以通过我的域层访问该接口。BL 中没有 DAL 代码——只是对提供的和抽象的数据层的调用。我对数据层的调用由提供者模式管理(没有直接引用),我只是这样做:

public class Person : IBusinessObject<Person>
{
   protected IDataLayer<T> dataLayer;

   Person Load() { this.dataLayer.Load(this); }

}

在我的数据层...

public class PersonMapper : IDataLayer<Person> 
{
    Person Load(Person person) {
    ...get DB stuff...map to person...decorate object...
       return person;
    }
}

我仍然不知道这是否好,但它对我来说效果很好。对于使用反射的嵌套对象,我也设法获得了延迟加载。

于 2009-10-09T11:55:23.110 回答