如何在C#中抽象实体数据上下文

时间:2012-03-26 12:15:57

标签: c# repository datacontext abstraction

在我的应用程序中,我使用Repository类创建了一个DAL。存储库使用一组EF类作为数据上下文

我想创建一个抽象,以便能够在相同的存储库中使用多个数据上下文。我使用以下代码初始化上下文(ProductEntities是EF上下文):

public class ProductRepository : IProductRepository
{
     ?type? _productEntitiesContext;

     public productRepository()
     {
         _productEntitiesContext = new ProductEntities();
     }

     public productRepository(?type? productContext)
     {
         _productEntitiesContext = productContext;
     }
}

但我不知道_productEntitiesContext(和productContext)的类型。 ProductEntities继承自ObjectContext

为了实现抽象我总是使用接口,我不知道我是否可以使用ObjectContext,因为它是一个类。

有人知道我的目标是否可以实现?

3 个答案:

答案 0 :(得分:2)

这样的东西?

public class ProductRepository<T> : IProductRepository where T: new()
{
     T _productEntitiesContext;

     public productRepository()
     {
         _productEntitiesContext = new T();
     }

     public productRepository(T productContext)
     {
         _productEntitiesContext = productContext;
     }
}

答案 1 :(得分:1)

不确定此处ProductEntities硬编码的问题是什么 - ProductRepository无论如何似乎都是产品特定的实现。

如果您想将ProductEntities注入您的存储库而不依赖于它,那么您可以创建一个标记界面,例如IProductEntities并在ProductEntities中实现

public interface IProductEntities { }

public partial class ProductEntities : IProductEntities { }

请记住,虽然ProductEntities是一个生成的类,但你仍然可以为它添加代码,因为它是部分的(如果它不是部分则作为旁注,那么你可以简单地继承它)

如果你真的想到可切换的数据上下文,你可能想要为IProductEntities接口添加一些方法。虽然,我怀疑是否需要切换上下文,我不确定谁将提供替代实现。

因为这样的存储库模式无论如何都是抽象数据访问,因此在这种方式中不会看到抽象EF上下文的任何价值。明天,如果你想使用另一个OR包装器(例如NHibernate),你可以提供另一个使用其他OR映射器的IProductRepository实现。

答案 2 :(得分:1)

如果您正在进一步抽象,可以考虑工作单元和IoC,那么stackoverflow上有很多例子。 linq-to-sql的示例也适用于Entity框架。我个人使用Entity框架在几个项目中实现了这一点。如果您有兴趣在下面的链接中阅读有关工作单元和IoC的信息。

DataContext, Repositories and Unit of Work

http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/

http://blogs.msdn.com/b/kylemc/archive/2011/08/18/unit-testing-a-wcf-ria-domainservice-part-2-the-repository-pattern.aspx

希望这会有所帮助。