8

我想在 ASP.NET 中构建一个具有 3 层架构的 Web 应用程序。但是我遇到了循环引用的问题。

我有 3 层:

  1. 包含 UI 的应用层。
  2. 包含所有逻辑和领域类的业务层。
  3. 包含所有数据库交互方法的数据层。

我正在使用业务层中的数据层方法来执行数据库操作,在这些方法中我需要将域类对象传递给数据层,但由于循环引用而无法完成。

例如,我有一个Person包含一些属性和方法的域类。现在我想将它Person插入数据库。我在 Person 类中有一个方法,名为InsertPerson(). 在这个方法体中,我必须调用数据层的函数来插入数据库。但是我无法将整个人对象传递给数据层方法,因为数据层引用已添加到业务层,反之亦然。

那么我该如何避免这个问题呢?请建议。

4

4 回答 4

6

是否可以将域对象从业务逻辑中分离出来以进行操作?所以你有描述数据的类,包含相对原始的操作,然后你的业务层是数据的更多操作——通常在一个操作中使用几个不同的类。

然后你最终有四个程序集:

  UI              /
  Business logic  | Domain classes
  Data layer      \

因此,所有三层都有效地使用域类作为通用术语。

我已经看到这项工作非常好 - 这确实意味着您的域类通常会变得有点“愚蠢”,尽管它们仍然可以包含围绕某些验证等方面的相关逻辑,这些逻辑与其他类无关。

当然,有很多替代方法:)

于 2013-04-02T05:56:10.650 回答
4

您的业​​务逻辑 dll 不应引用数据访问层。数据访问层应该引用您的业务逻辑 dll。业务逻辑代码应该定义它想要与之交谈的接口,以便访问数据库(或其他业务逻辑外部的东西),其他 dll 应该实现它们以为业务逻辑层提供服务。

这就是依赖倒置原则。它说高级模块不应该依赖于低级模块。这里的业务逻辑是高级模块。从业务逻辑 dll 的角度来看,数据访问 dll 只是实现细节。

显示示例

BLL:

public interface IPersonRepository
{
    void SavePerson(Person p);
}
public class PersonServices
{
    PersonServices(IPersonRepository repo)
    {
      //
    }
    public void FirePerson(Person toFire)
    {
        toFire.FireHim();
        repo.SavePerson(toFire);
    }
}

达尔:

public class PersonRepository : IPersonRepository
{
   // ...
}
用户界面:
var repo = new PersonRepository();
var ps = new PersonService(repo);   // wire by hand or use container

ps.FirePerson(somePerson);

参考:

用户界面-> BLL
   -> 达尔

DAL -> BLL

BLL -> 什么都没有!
于 2013-04-02T06:03:04.227 回答
1

你最好使用经典的DDD:域(业务逻辑)不应该有任何对 DAL(持久性基础设施)的引用,它只是声明基础设施必须实现的接口(存储库),而不是在应用程序层中编写使用域的应用程序服务和表示层仅使用应用程序层(或分布式服务,如果它与分布式应用程序有关):

在此处输入图像描述

(D)DDD 的好例子:http ://microsoftnlayerapp.codeplex.com/

于 2013-04-02T05:57:11.910 回答
-1

如果您在应用程序中使用 3 层架构,则无法将对象传递到数据访问层。对象只能用于业务层。如果要在数据访问层使用对象,最好的架构是域模块。

于 2013-04-02T05:56:04.520 回答