我正在尝试使用ASP.NET和C#来创建简单的三层架构应用程序。我遇到了一个循环依赖的问题。我在业务层上有学生班。我有一个到表示层的接口,其中包含这些方法:
void SaveStudent(Student student);
Student[] GetStudents();这看起来没问题。
但我也使用这些方法实现了从数据访问层到业务的接口:
void InsertStudent(Student student);
Student[] ReadAllStudents();问题出在学生课上。因为我的业务层依赖于DAL,所以我不能从我的数据访问层引用业务层。我知道DAL不应该依赖于业务层。但是不知道如何解决这个问题。
那么我应该如何传递数据呢?
如果我将Student类放到DAL,那么我的表示层将被迫依赖于数据访问层,这是不好的。
我以前从来没有尝试过做三层架构。
如何解决这个问题?如果需要,可以随意更改我的接口方法。
发布于 2011-02-26 20:45:27
这个问题通常可以通过将您的Student类放在一个单独的模型程序集中(随您喜欢怎么叫它)来解决,该程序集将在所有层之间共享。在大规模的n层体系结构中,这些类通常只包含数据,通常称为数据转换对象(DTO)。作用于这些对象的任何业务逻辑都将保存在业务层(BL)中,业务层通常作为服务(即WCF)公开。服务只是一个中介,即使所有代码都在同一台机器上,甚至在同一进程中,您也可以这样设计。至少,您希望在组装级别分离您的关注点(UI、业务层、DTO、DAL)。
在您的示例中,GetStudents方法将在业务层服务上公开,并将返回Student DTO。业务层将保存对数据访问层(DAL)的引用,它将在该层上调用InsertStudent。同样,正如我已经说过的,DAL和BL都引用了Models程序集,但最重要的是,DAL不依赖于BL。
客户端-->业务层服务-->数据访问层
<->
发布于 2011-02-26 20:29:03
n-tier体系结构中的关键概念是n-th层只知道n+1-th层。因此,您的用户界面将调用业务逻辑,业务逻辑将调用数据访问层。
发布于 2011-02-26 20:29:02
您不应该从DAL调用到BLL (业务逻辑层),恰好相反。
// Will contain details about your UI - taking data from text fields, etc
// and passing it to the business object
class Student_UI
{
Student_BL _blObject = new Student_BL();
void SaveStudent()
{
Student student = new Student();
// Get student details from UI...
_blObject.SaveStudent(student);
}
DisplayStudents()
{
Student[] students = _blObject.GetStudents();
// display students...
}
}
class Student_BL
{
Student_DAL _dalObject = new Student_DAL();
void SaveStudent(Student student)
{
_dalObject.InsertStudent(student);
}
Student[] GetStudents()
{
return _dalObject.ReadAllStudents();
}
}https://stackoverflow.com/questions/5126884
复制相似问题