在EntityFramework和NHibernate之间切换

时间:2010-11-08 14:06:12

标签: c# .net nhibernate frameworks entity

我正在实施一个大学项目来测试Entity Framework 4.0与NHibernate(最新版本)相比的性能。我正在构建一个简单的事务处理系统来进行此测试。我的实体将是客户,账户,订单,产品等。

我想创建两个独立的DAL;第一个DAL将是EntityFramework,而第二个将是NHibernate。然后,我将创建一个业务逻辑层(BLL),它引用一个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

我在Julia Lerman的“编程实体框架第2版”的章节中部分地基于这种方法。我是NH和EF(特别是NH)的新手,所以任何建议或建议都会受到赞赏。谢谢。

2 个答案:

答案 0 :(得分:4)

您正在寻找的是存储库模式。请参阅(在许多其他位置中)https://stackoverflow.com/questions/3175/repository-pattern-tutorial-in-c作为示例。

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

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

然后创建此接口的两个实现:一个用于Entity Framework,另一个用于NHibernate。

最后,您创建了一种机制,以根据接口获取所需的实现。像Windsor这样的IoC容器非常棒。

答案 1 :(得分:0)

如果要测试性能,则不应创建中间层。在具有相同输入/输出的两种情况下都使用原始代码,但仅此而已。

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

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