2010-06-25 104 views
2

我有一个关于n层体系结构的问题。在提出这个问题之前,我想了很久并且很努力,因为这里已经有很多类似的问题了......但是,在一天半的时间里看完这些问题并阅读其他答案后,我仍然不确定。各种看似相似的术语和不同的方法让我感到困惑。n层体系结构 - BLL,DAL和接口。什么是最佳做法?

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

我的问题是什么是在另一边创建对象的最佳方法是什么?例如,如果我在实现IPerson的BLL中有一个Person对象,并且还有一个PersonDataObject或者实现IPerson的DLL中的任何对象,我将Person传递给DAL中的一个方法,该方法需要IPerson的参数,然后在DAL中, d必须重构一个PersonDataObject来保存。这甚至是最好的方法吗?

对不起,我可能没有解释得这么好,因为我很困惑。对于傻瓜答案的最佳做法将不胜感激。

回答

5

一般来说,在BLL的对象会消耗接口 - 没有实现他们:

例如,如果我不得不在BLL Person对象 是实现IPerson, 和PersonDataObject或任何在 同时实现IPerson的DLL

以“Person”为例:思考与某人关联的不同数据操作(获取单个人的所有数据,获取许多人的浅数据集合, CRUD操作,搜索等) - 然后沿着逻辑分组设计界面(请参阅Interface Segeragtion Principle)。

这些接口可能代表以BL为中心的操作 - 或基于“服务”的操作。

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

我定义我的DTO相当于公司的一个共同的组件,并在单独的一个数据接口以及 - 所以我有4个组件:BL,数据访问接口定义,接口实现和通用;所有程序集都引用常见的程序集我正在C#.Net中工作,我将DTO定义为结构体(但您可以使用类);并且它们的所有属性都是只读的 - 在构造函数中向它们提供数据 - 这样DTO就是有效的“哑”信息包络。

+0

而我忘了包括的内容:让BL调用一个“Factory”方法,它负责实例化具体的实现;我倾向于在配置中将它们定义为易于更改。 – 2010-06-27 05:40:46

1

Google针对域驱动设计和存储库模式。它听起来像你正朝着你的架构朝着这个方向前进,并且依赖于场景的保证,我会在更复杂的代码中使用这种方法。

2

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

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