n层架构 - BLL,DAL和接口。什么是最佳做法?

时间:2010-06-25 22:33:21

标签: architecture orm data-access-layer bll n-layer

我对n层架构有疑问。在问这个问题之前,我想了很久很久,因为这里已经有很多类似的问题......然而,经过一天半的时间看着它并阅读其他答案后,我仍然不确定。各种看似相似的术语和不同的方法使我感到困惑。

如果我在不同的类库中有一个BLL和一个DAL,BLL和DAL之间进行通信的一种方法是使用一个接口,就像在BLL和DAL引用的另一个单独的DLL中定义的DTO一样。我在BLL中的域模型实体将实现此接口,因此DAL中的任何ORM生成对象也将实现此接口。为了保存我的业务实体,我可以将它们传递给DAL,它可以接受它们,因为它们实现了共享接口。我还可以将对象传递回实现此接口的BLL。这似乎是合理的,因为BLL和DAL只需要知道基本接口,而不是每个其他具体实现。

我的问题是在另一边创建对象的最佳方法是什么?例如,如果我在BLL中实现了一个实现IPerson的Person对象,以及一个PersonDataObject或同样实现IPerson的DLL中的任何东西,我将Person传递给DAL中的一个方法,该方法接受IPerson的参数,然后在DAL I'中d必须重建PersonDataObject才能持久化。这甚至是最好的方法吗?

对不起,我可能没有解释得太好,因为我很困惑。对于假人答案的最佳做法将非常感激。

3 个答案:

答案 0 :(得分:5)

一般来说,BLL中的对象将使用接口 - 而不是实现它们:

  

例如,如果我有一个Person对象   在实施IPerson的BLL中,   和一个PersonDataObject或其他任何东西   同时实现IPerson的DLL

以“人”为例:考虑与人相关的不同数据操作(获取单个人的所有数据,为许多人提供浅层数据,CRUD操作,搜索等) - 然后设计逻辑分组的接口(参见Interface Segeragtion Principle)。

接口可能代表以BL为中心的视角 - 或基于“服务”的视角。

无论如何,要回答你的具体问题......

我在公共程序集中定义了DTO的等价物,在单独的数据接口中定义了数据接口 - 所以我有4个程序集:BL,数据访问接口定义,接口实现和通用;所有程序集都引用了常用程序集。

我在C#.Net工作,我将DTO定义为结构(但你可以使用类);并且这些属性都是只读的 - 你在构造函数中将数据提供给它们 - 这样DTO就是有效的“哑”信息包络。

答案 1 :(得分:2)

在遵循n层架构时,在BL和DAL之间共享数据对象是很常见的。有时,同样的数据对象也可以在UI层中使用。

通常我有一个数据模型(或数据对象或域模型,无论你怎么命名)程序集,它将所有模型对象作为接口。以你的人为例,我将在模型汇编中创建一个IPeople接口。 DAL会将一个IPeople实例返回给BL。 BL将使用此实例,如果需要,在应用业务逻辑后将其传递给UI层。

答案 2 :(得分:1)

Google用于域驱动设计和存储库模式。它就像你正朝着这个方向走向你的架构,并且根据场景保证它我会在更复杂的代码上使用这种方法。