如何在c#中的抽象层之间传递对象?

时间:2011-07-12 12:49:49

标签: c# architecture datatable

所以,我有一个使用以下层构建的应用程序:

Application layout

截至目前,我没有使用任何Object的概念从最底层获取数据。我只是使用DataTables来获取数据。我对此不满意,因为它要求业务逻辑层知道列名等。

在我的业务逻辑层中,我有从这些DataTable加载的对象,服务层通过这些对象的集合与这些对象一起工作。

这是我的问题。如果我想让数据抽象层接受并回复对象,我该如何避免从服务层引用DAL?我已经读过对象工厂是一种方式,而且我已经读过我可以构建对象转换函数等等。

成功应用此方法的最佳方式是什么?我的最终目标是为不同的数据库服务器供应商提供可插拔的DAL。

4 个答案:

答案 0 :(得分:6)

标准方法,我经常采用的方法是拥有一个公共的对象模型库,代表我的域:Customer,Order,OrderLine等,它们在所有层之间共享。

更好的是,不要跨层共享类型,只需共享接口并在需要实例时提供工厂。

然后你可以有一个可插拔的DAL,但你的DAL仍然需要符合返回ICustomer的合同。

这不会阻止引用被引用,至少需要引用接口 - 正如其他人已经注释的那样,其他引用也可以用于强类型或工厂,例如IoC / DI框架。

我看待它的方式:通用模型是应用程序设计中的一个交叉问题,不应被视为打破分层。

更新:这是对解决方案的一个非常模糊的解释,所以我坚持将其建立在上面。

更新2:,现在当然要回答您的问题。直接删除对DLL的引用的标准方法是通过接口公开合同,在您的情况下是DAL方法GetCustomers,您的服务层与接口进行通信,但是通过依赖注入请求DAL实例/控制框架的倒置,或者更容易,一个工厂。我通常去小工具的工厂路线,它涉及另一个DLL。服务层将引用接口和工厂,DAL将引用接口,工厂将引用接口和DAL。

enter image description here

答案 1 :(得分:1)

在“Common”程序集中定义简单对象(或接口),并使用它们。

为此,需要交换数据的所有图层/程序集都需要引用此公共程序集;因此,你会希望公共组件在依赖性方面非常精益 - 否则你将污染你应用程序的其余部分。

答案 2 :(得分:0)

另一种方法是使用普通旧clr对象(PO​​CO)。您的数据抽象和业务层可以利用这一点。在POCO域模型下,通常使用像nhibernate这样的工具来管理持久性。

nhibernate不是接口,而是通过装饰(XML文件或属性)引入了一个“代理”来无形地引入持久性行为。一旦你习惯了这种方法,你就可以获得很高的效率。

此外,所有三个层都可以利用相同的简单POCO对象,这可以简化一些事情。

re:不同的程序集,要么将对象放在可共享的程序集中,要么(就像MS经常那样),使用代码生成在其他层中生成相同的POCO“模式”。有时中间组件不可共享......或者您想在附加层中引入变体(可能是出于安全考虑)。所以链接只依赖于序列化,同时定义一次(POCO模式)并通过工具(代码生成部分)将模式引入不同的层。

希望有所帮助。

答案 3 :(得分:0)

对于简单的应用程序,我喜欢......

  • 在我的DAL中使用ORM来简化数据访问(Entity Framework
  • 使用存储库模式进行CRUD操作(Repository Pattern
  • 使用存储库模式作为DAL的抽象,将ORM的对象映射到DTO或模型/域对象(DTO

我也是......

  • 对存储库使用依赖注入框架,这允许您插入任何数据库(StructureMap
  • 编写单元测试并模拟我的存储库(NUnit

但是,如果我有一个新项目,我将使用EF4代码优先,而不是使用ORM-DTO映射层。 (Code-First wit EF4

和平!