13

例如,如果您有一个名为 Person(ID、Name 等)的数据库表,数据访问层应该将哪种对象返回给业务层?我在想这样的事情:

//data access tier
public class DataAccess{

   public interface IPerson{
      int ID{ get; set; }
      string Name{ get; set; }
   }

   internal class Person : IPerson{
      private int id;
      private string name;

      public int ID{ get{return id; } set{ id=value; } }
      public int Name{ get{retutn name; } set{ name=value; }
   }

   public static IPerson GetPerson(int personId)
   {
      //get person record from db, populate Person object
      return person;  
   }
}

//business tier
public class Person : IPerson{
   private int id;
   private string name;

   public int ID{ get{return id;} set{id=value;} }
   public string Name{ get{return name;} set{name=value;} }

   public void Populate(int personId){
      IPerson temp = DataAccess.GetPerson(personId);
      this.ID = temp.ID;
      this.Name = temp.Name;
   }
}

但这一切似乎有些繁琐?这个问题有更优雅的解决方案吗?我应该将 DataRow 从数据访问层返回到业务层吗?

4

4 回答 4

21

您无需在数据访问层 (DAL) 中重复类定义。

您可以在单独的程序集中将您的业务实体创建为“哑”容器,例如您的 Person 类可以是:-

public class Person
{
    int ID { get; set: }
    string Name { get; set: }
}

然后,您可以为您的 DAL 提供对业务实体层的引用。您的控制器对象,无论它们是在单独的业务逻辑层中还是在您的 UI 层中,都可以调用 DAL,它可以创建一个业务实体,从数据库中填充它并将其返回给您的控制器。

Imar Spaanjaars 的这篇文章很好地解释了这种模式。

于 2009-02-05T23:00:26.030 回答
6

您的业​​务层肯定不想知道数据行 - 尝试将数据特定类留在数据层中。这减少了耦合,让您可以在以后更改持久层,而无需大规模重新架构。

要解决您的特定问题,您可以:

  • 在您的数据层中创建基本数据对象/实体并将它们交给您的业务层以供使用。
  • 或者,正如您正在做的那样,创建纯粹作为将数据从数据层传输到更高层中更丰富的业务对象实现的一种方式存在的 DTO(数据传输对象)。您可以将其作为富域模型中存储库模式的一部分来执行。

您可能要考虑的另一件事是 tiers v layers - 它会影响您对这些事情的看法。层通常是物理层,换句话说,它们定义了进程之间的边界。层通常是合乎逻辑的,它们将程序的功能分成松散耦合的单元。在这种情况下,您的目标是图层。

于 2009-02-05T23:11:24.760 回答
1

如果您为 DAO 类创建接口并将它们放置在业务层中,则可以从数据访问层引用您的业务层。数据层中的 DAO 类从业务层返回对象。

您的业​​务层引用接口而不是直接引用数据访问对象。通过 IoC 容器(例如 Castle Windsor)的依赖注入将允许您完成此操作。

这种技术称为分离接口,如下所述:

http://www.martinfowler.com/eaaCatalog/separatedInterface.html

我所见过的对这种技术的最佳解释可以在这篇关于 NHibernate 最佳实践的文章中找到,该文章由 Billy McCafferty 撰写。

http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

这篇文章有很多特定于 NHiberbate 的信息,但其中很大一部分只是关于设计松散耦合和易于单元测试的应用程序的可靠信息。

于 2009-02-06T00:09:44.143 回答
0

由于每个层都必须与上层松散耦合的规则,将 BL 引用添加到 DAL 并不是一个好主意。它更好地在 DAL 中定义具有接口的数据模型,并在 BL 中制作业务实体形式。根据我的经验,最好在 DAL 中使用存储库并在您的业务实体或业务流程中访问。

于 2013-05-07T07:10:24.500 回答