抽象出一个ORM提供者

时间:2012-02-16 13:16:26

标签: .net entity-framework dependency-injection abstraction

在我的ASP.NET MVC 3应用程序中,我现在将EF4.3用作ORM框架。我希望将来有能力替换它,以备我需要。这需要定义一个接口,在EF的情况下将指向DbContext实现。

我在界面中为可查询对象定义了什么?

例如在我的情况下,我会做以下事情,但不知道这是否是正确的方法:

在我的界面中:

    IQueryable<AnonymousUser> AnonymousUsers { get; }

    int SaveChanges();

在我的DbContext中:

    public DbSet<AnonymousUser> AnonymousUsers { get; set; }

    IQueryable<AnonymousUser> IThoughtCatStorage.AnonymousUsers
    {
        get { return AnonymousUsers; }
    }

如您所见,使用IQueryable是抽象DbSets的一种方法。

这是最好的方法吗? (我知道这听起来像讨论一样,但我只是想知道目前是否有更通用的方法来定义ORM访问接口。)

2 个答案:

答案 0 :(得分:1)

我过去写过一篇关于这篇文章的博文:

Faking your LINQ provider part 1

答案 1 :(得分:1)

不要在任何地方使用你的OR / M.使用存储库类抽象出OR / M,并使代码的单元测试更容易。它还消除了代码重复,并使将来更容易维护代码。

您的好处是,如果您将来需要切换OR / M,则只需更改存储库类。

不要忘记我们都选择了一个OR / M是因为某个原因(你最喜欢的OR / M有的功能)。通过抽象出通用OR / M层后面的OR / M,您也可以删除使用这些功能的可能性。