我不希望我的对象知道我的业务层 - 所以如何加载它?

时间:2011-10-13 17:39:06

标签: c# sql-server oop

我发布了这个:

Object depending on another object - when to load its properties

在阅读了这篇文章并进行了更多研究之后,我逐渐意识到延迟加载对我的情况来说是理想的。但是,一些背景信息。我发布的Department类从数据库(Sql Server 2k5)获取其属性数据。它是您典型的设置:

Front End->BOL->DAL

所以我想保持我的Department课程基本上只保留与之相关的信息。我没有/不想将我的业务对象类暴露给这个类。那么如何在不必调用业务对象层的情况下填充我的部门对象。

我认为代码会有所帮助:

public class Employee 
 { 
   public int ID { get; set; } 
   public string FirstName { get; set; } 
   public Department d { get; set; }  //todo: implement lazy load in get.
   public Employee(int ID, string FirstName) 
       { 
         this.ID = ID; 
         this.FirstName = FirstName; 
       } 
 } 


class Department 
 { 
  public string DepartmentID { get; set;} 
  public string CostCenter { get; set; } 
  public bool hasManager { get; set; } 
  //more code 
  //constructor for department 
 } 

然后说我的BOL用来打电话给我的DAL做类似的事情:

//some bol class that simply calls the data access layer class
DAL.GetDepartments("SomeDepartment");

DAL会执行一些代码来返回一些数据以填充部门对象......

但是,如果我懒惰加载部门的get属性,那么它需要知道我的BOL所以我必须添加using语句以包含该类好。这不是正确的方法......任何提示或指示?

3 个答案:

答案 0 :(得分:1)

如果您真的想要延迟加载组件,请查看一些ORM,如NHibernate,EF4等。

创建自己的延迟加载解决方案并不是一项简单的任务,它涉及一些复杂的概念,如动态代理,可能是IL生成和其他高级主题。

无论如何,关于您的依赖关系问题以及是否使用DAL中的BOL,请检查您是否可以申请dependency inversion

答案 1 :(得分:1)

在我当前的项目中,几乎所有的域业务对象都至少有两个构造函数。 (1)为该对象获取一个id,以便它可以自行构建,从db本身提取数据。另一个构造函数(2)获取该域对象所需的数据实体。通过这种方式,我可以急切地加载或延迟加载,以当时最好的为准。

因此,如果有人调用您的Employee业务对象Department属性,该属性可以检查它是否已经具有该属性。如果没有,您可以从员工数据中获取DepartmentID,实例化部门,然后(存储if和)返回它。通过这种方式,您可以轻松获得所需的任何域对象。

但是你仍然想要那里的渴望加载选项。假设您有一个Department业务对象,Employees属性返回List(Of Employee)。 Employees属性将直接从数据库获取数据,并使用 data 构造函数实例化每个Employee。因此,您将拥有酷炫的Employee业务对象,其中有80个,但只有一个数据查询。

然后将其提升一个档次,您的对象可以接受多层数据。例如,您可以使用DAL中的Employee实体构建Employee,其中还包括Department,Supervisor等的数据。“ID”构造函数也可以从一开始就获取此数据。

最终,您将做出一些决定来预先加载什么以及延迟加载什么。例如,可能有90%的时间构建Employee,您还需要Department数据。然后,您可能决定在使用EmployeeID构造函数构造员工时获取Department数据。但是,例如,主管数据仅在8%的时间内使用。你可能决定总是懒得加载它。

答案 2 :(得分:0)

显然,简单的答案是无法完成的。要么你必须让你的业务对象知道你的数据层(如果你走这条路线,一定要使用DI),或者你不能在业务类中延迟加载。一个愉快的媒介可能是创建一个知道DAL工作和业务层的服务类,并知道如何加载和创建业务对象。当然,正如Juanma所说,ORM是为了做这种事而建立的。