Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 使OR/M松散耦合并从其他层抽象出来_Nhibernate_Persistence_Abstraction_Coupling_Loose - Fatal编程技术网

Nhibernate 使OR/M松散耦合并从其他层抽象出来

Nhibernate 使OR/M松散耦合并从其他层抽象出来,nhibernate,persistence,abstraction,coupling,loose,Nhibernate,Persistence,Abstraction,Coupling,Loose,在n层体系结构中,放置对象关系映射(OR/M)代码的最佳位置是数据访问层。例如,数据库查询和更新可以委托给NHibernate之类的工具 然而,我希望在数据访问层中保留对NHibernate的所有引用,并将抽象依赖关系从其下面或上面的层中移除。这样,我可以交换或插入另一个or/M工具(例如实体框架)或某种方法(例如普通存储过程调用、模拟对象),而不会导致编译时错误或整个应用程序的大修。可测试性是一个额外的好处 有人能推荐一种包装器(即接口或基类)或方法,使or/M松散耦合并包含在一层中吗?或者给

在n层体系结构中,放置对象关系映射(OR/M)代码的最佳位置是数据访问层。例如,数据库查询和更新可以委托给NHibernate之类的工具

然而,我希望在数据访问层中保留对NHibernate的所有引用,并将抽象依赖关系从其下面或上面的层中移除。这样,我可以交换或插入另一个or/M工具(例如实体框架)或某种方法(例如普通存储过程调用、模拟对象),而不会导致编译时错误或整个应用程序的大修。可测试性是一个额外的好处

有人能推荐一种包装器(即接口或基类)或方法,使or/M松散耦合并包含在一层中吗?或者给我指一些有帮助的资源


谢谢。

听起来你在寻找图案。如果需要更多的解耦,可以使用容器注入数据依赖项。

服务外观模式是一个名称。业务逻辑和数据层之间的简单契约

服务类或bean(可以随意称呼)定义和实现契约,并协调较低的数据层,通常处理跨数据对象的事务逻辑

在Spring中,您定义一个接口,然后实现它。一个实现可能是OR/M,另一个可能是原始JDBC或ADO.NET。在某些框架中,面向方面编程允许您在不编写任何代码的情况下注入声明性事务逻辑。这样可以省去很多头痛


有一点需要注意:在处理某些OR/Ms(如Hibernate)时,需要使用代理类。这确实会造成污染,因为在一些情况下代理类会导致问题。在我看来,这是一个不应该脱离服务层的实现细节。但在Hibernate中,确实如此。不确定.NET实现。

我还需要数据映射器或DAO,因为存储库位于域模型和数据访问层之间。请参阅此处的更多详细信息:域模型将包含存储库,但不能保存对数据访问层的引用。因此,需要将DAO注入到存储库中。我的主要目标是使每种数据访问技术(例如NHibernate、实体框架、XML数据存储等)的基本DAO类继承一个公共接口。这样,我就可以随意交换或混合它们,而无需重新编译或进行大量返工。我只是想定义合同或接口应该是什么样子。我认为它将有标准的CRUD方法,以及一些用于会话和事务管理的方法。顶级的.NET或/M工具和ADO.NET(实体框架除外)似乎使创建此类契约变得简单。然而,我担心的是,尽管我的项目存在重大缺陷,但它可能会继续下去。我想推广NHibernate,但给自己留一个以防万一的实体框架。感谢您提供有关声明性事务逻辑的提示。