2010-11-08 57 views
1

我正在实施一个大学项目来测试实体框架4.0与NHibernate(最新版本)相比的性能。我正在构建一个简单的事务处理系统来执行此测试。我的实体将是客户,帐户,订单,产品等。在EntityFramework和NHibernate之间切换

我想创建两个单独的DAL;第一个DAL将是EntityFramework,而第二个将是NHibernate。然后,我将创建一个业务逻辑层(BLL),它引用一个DAL或另一个DAL,并使用它来测试。 BLL将包含像'insertNewOrder()','amendExistingOrder()'等方法。我希望我的BLL独立于框架,因此我可以轻松地在每个DAL之间切换。

为了实现这一点,我建议实现一个接口'IContext',它将由每个DAL实现。 'IContext'将包含每个实体的'get()'方法以及'Save()'方法。然后每个DAL将以他们自己特定的方式实现这些方法。 'get()'方法将返回一个IObjectSet,而不是一个ObjectSet。

我将使用T4模板从我的EDM创建POCO实体并将它们移动到单独的项目中。然后每个DAL可以引用相同的一组POCO实体。

然后,我的BLL将创建一个IContext接口的实例,并在该接口上调用方法,而不是创建特定的上下文(ObjectContext或ISession)。

这听起来像一个可行的解决方案吗?我在这个主题上找到的任何文章都包括使用知识库,这是一种我不完全了解的模式,并且如果可能的话,不想实施。我的重点是测试每个平台,而不是构建一个架构正确的应用程序。在这里看到,例如:

Entity Framework POCO objects

我已经部分地基于从“编程实体框架的第二版”,由朱莉娅·勒曼在章这一做法。我对新罕布什尔州和EF(特别是新罕布什尔州)都是新手,所以任何意见或建议,将不胜感激。谢谢。

+0

退房http://ormbattle.net/。将您的结果与它比较可能会很有趣。他们还描述和讨论了测试,这可以给你更多的想法:http://ormbattle.net/index.php/performance-tests.html – 2010-11-08 15:46:39

回答

4

您正在寻找的是存储库模式。参见(在很多其他地方)https://stackoverflow.com/questions/3175/repository-pattern-tutorial-in-c作为例子。

存储库模式背后的想法是,你创建的接口为数据访问,例如:

public interface IAddressRepository 
{ 
    Address GetById(int id); 
} 

然后创建这个接口的两个实现:一个是实体框架和一个NHibernate的。

最后,根据接口创建一个机制来获取您需要的实现。 IoC容器如Windsor在这方面很出色。

0

如果你想测试性能,你不应该创建中间层。在两种情况下都使用相同输入/输出的原始代码,但仅限于其他情况。

创建中间层将限制您在两种情况下的最小分母。通过分开实现两个竞争部分,您可以针对一种技术进行优化和具体实现,这对于相同的访问层来说是不可能的。

此外,您的任务不是创建相同的DAL,而是测试性能。因此,在尝试其他方法之前,您应该先开始担心两种技术中的优化和特殊情况。

+0

感谢您的答复。我认为现在我会继续我的中间层方法。我很高兴保持项目范围限于框架在应用于特定场景(本例中为事务处理系统)时以(相对)默认配置执行的方式。我已经得到一位主管的建议,以确保我和喜欢的人相比,而且这些都是相当实质的框架。如果我分别看每一个,我可能会得到太多的材料,永远不会完成! – JMc 2010-11-09 13:29:10