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

如何在c#中的操作层之间传递对象?,c#,architecture,datatable,C#,Architecture,Datatable,因此,我有一个由以下层构成的应用程序: 到目前为止,我没有使用任何对象概念来从最底层获取数据。我只是使用DataTables来获取数据。我对此不满意,因为它要求业务逻辑层知道列名等 在我的业务逻辑层中,我有从这些数据表加载的对象,服务层通过这些对象的集合来处理这些对象 这是我的问题。如果我想让数据抽象层接受并回复对象,如何避免从服务层引用DAL?我读过,对象工厂是一种方法,我也读过,我可以构建对象转换函数等等 你成功运用这项技术的最佳方式是什么?我的最终目标是为不同的数据库服务器供应商提供可

因此,我有一个由以下层构成的应用程序:

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

在我的业务逻辑层中,我有从这些数据表加载的对象,服务层通过这些对象的集合来处理这些对象

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


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

我经常采用的一种标准方法是,拥有一个通用的对象模型库来表示我的领域:客户、订单、订单行等,这些模型在所有层间共享

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

然后,您可以拥有一个可插拔的DAL,但您的DAL仍然需要遵守返回ICCustomer的合同

这并不意味着不需要引用,至少需要对接口的引用——正如其他人所评论的那样,其他对强类型或工厂的引用可以被分解出来——比如IoC/DI框架

在我看来:commom模型是应用程序设计中的一个交叉关注点,不应被视为破坏分层

更新:这是对该解决方案的一个非常模糊的解释,因此我将以它为基础

更新2:现在当然要回答您的问题。直接删除对DLL的引用的标准方法是通过接口公开契约,在您的情况下,DAL方法
GetCustomers
,您的服务层与接口对话,但通过控制框架的依赖项注入/反转请求DAL实例,或者更容易地,通过工厂。我通常会选择工厂路线来开发小应用程序,这涉及到另一个DLL。服务层将引用接口和工厂,DAL将引用接口,工厂将引用接口和DAL

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


为此,需要交换数据的所有图层/部件都需要引用此通用部件;因此,您需要使通用程序集在依赖性方面非常精简,否则会污染应用程序的其余部分。

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

nhibernate引入了一个“代理”,通过修饰(XML文件或属性)以不可见的方式引入持久性行为,而不是接口。一旦习惯了这种方法,您就可以非常高效地使用它

此外,所有三个层都可以利用相同的简单POCO对象,从而在某种程度上简化事情

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


希望对您有所帮助。

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

  • 在我的DAL中使用ORM简化数据访问()
  • 将存储库模式用于CRUD操作()
  • 使用存储库模式作为DAL的抽象,将ORM的对象映射到DTO或模型/域对象()
而且我

  • 对存储库使用依赖项注入框架,这允许您插入任何数据库()
  • 编写单元测试并模拟我的存储库()
然而,如果我有一个新项目,我会先用EF4编写代码,而不是使用ORM-DTO映射层。()


和平

你需要一些抱歉,我花了一段时间才真正回答你的问题-我太专注于标题了!:-)另外,如果您想要可插拔的DAL,您应该使用接口强制执行这些方法,这样移动到另一个DB只需要更改工厂中实例化的类或您执行该操作的方式。@Adam-我不确定%100是否同意您的图表-但我绝对同意这种方法。@Adrian嗯,这是一个引用类图,所以它不是这将是一个伟大的lol。除了DAL可能引用了共享模型(以及工厂)之外,这往往是我用于小工厂的设置。@Adam,你是如何生成这个漂亮的图形的?我只是想问同样的问题:)