所以,我有一个使用以下层构建的应用程序:
截至目前,我没有使用任何Object的概念从最底层获取数据。我只是使用DataTables来获取数据。我对此不满意,因为它要求业务逻辑层知道列名等。
在我的业务逻辑层中,我有从这些DataTable加载的对象,服务层通过这些对象的集合与这些对象一起工作。
这是我的问题。如果我想让数据抽象层接受并回复对象,我该如何避免从服务层引用DAL?我已经读过对象工厂是一种方式,而且我已经读过我可以构建对象转换函数等等。
成功应用此方法的最佳方式是什么?我的最终目标是为不同的数据库服务器供应商提供可插拔的DAL。
答案 0 :(得分:6)
标准方法,我经常采用的方法是拥有一个公共的对象模型库,代表我的域:Customer,Order,OrderLine等,它们在所有层之间共享。
更好的是,不要跨层共享类型,只需共享接口并在需要实例时提供工厂。
然后你可以有一个可插拔的DAL,但你的DAL仍然需要符合返回ICustomer的合同。
这不会阻止引用被引用,至少需要引用接口 - 正如其他人已经注释的那样,其他引用也可以用于强类型或工厂,例如IoC / DI框架。
我看待它的方式:通用模型是应用程序设计中的一个交叉问题,不应被视为打破分层。
更新:这是对解决方案的一个非常模糊的解释,所以我坚持将其建立在上面。
更新2:,现在当然要回答您的问题。直接删除对DLL的引用的标准方法是通过接口公开合同,在您的情况下是DAL方法GetCustomers
,您的服务层与接口进行通信,但是通过依赖注入请求DAL实例/控制框架的倒置,或者更容易,一个工厂。我通常去小工具的工厂路线,它涉及另一个DLL。服务层将引用接口和工厂,DAL将引用接口,工厂将引用接口和DAL。
答案 1 :(得分:1)
在“Common”程序集中定义简单对象(或接口),并使用它们。
为此,需要交换数据的所有图层/程序集都需要引用此公共程序集;因此,你会希望公共组件在依赖性方面非常精益 - 否则你将污染你应用程序的其余部分。
答案 2 :(得分:0)
另一种方法是使用普通旧clr对象(POCO)。您的数据抽象和业务层可以利用这一点。在POCO域模型下,通常使用像nhibernate这样的工具来管理持久性。
nhibernate不是接口,而是通过装饰(XML文件或属性)引入了一个“代理”来无形地引入持久性行为。一旦你习惯了这种方法,你就可以获得很高的效率。
此外,所有三个层都可以利用相同的简单POCO对象,这可以简化一些事情。
re:不同的程序集,要么将对象放在可共享的程序集中,要么(就像MS经常那样),使用代码生成在其他层中生成相同的POCO“模式”。有时中间组件不可共享......或者您想在附加层中引入变体(可能是出于安全考虑)。所以链接只依赖于序列化,同时定义一次(POCO模式)并通过工具(代码生成部分)将模式引入不同的层。
希望有所帮助。
答案 3 :(得分:0)
对于简单的应用程序,我喜欢......
我也是......
但是,如果我有一个新项目,我将使用EF4代码优先,而不是使用ORM-DTO映射层。 (Code-First wit EF4)
和平!