【问题标题】:Switching between EntityFramework and NHibernate在 EntityFramework 和 NHibernate 之间切换
【发布时间】:2010-11-08 14:06:12
【问题描述】:

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

我想创建两个单独的 DAL;第一个 DAL 将是 EntityFramework,而第二个将是 NHibernate。然后,我将创建一个引用一个 DAL 或另一个的业务逻辑层 (BLL),并使用它进行测试。 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 的“Programming Entity Framework 2nd Edition”中的一章。我对 NH 和 EF(尤其是 NH)都是新手,因此我将不胜感激任何建议或建议。谢谢。

【问题讨论】:

标签: c# .net nhibernate frameworks entity


【解决方案1】:

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

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

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

然后您创建此接口的两个实现:一个用于实体框架,一个用于 NHibernate。

最后,您创建一种机制来根据接口获取所需的实现。像 Windsor 这样的 IoC 容器在这方面做得很好。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复。我认为我现在将继续我的中间层方法。我很高兴将项目的范围限制在当应用于特定场景(本例中的事务处理系统)时框架在(相对)默认配置中的执行方式。主管建议我确保我与同类进行比较,而且这些都是相当重要的框架。如果我分别看每一个,我可能会得到太多的材料而永远无法完成!
    猜你喜欢
    • 2010-10-28
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多