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

本文关键字:实体 数据 上下文 抽象 | 更新日期: 2023-09-27 18:28:58

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

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

public class ProductRepository : IProductRepository
{
     ?type? _productEntitiesContext;
     public productRepository()
     {
         _productEntitiesContext = new ProductEntities();
     }
     public productRepository(?type? productContext)
     {
         _productEntitiesContext = productContext;
     }
}

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

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

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

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

类似的东西?

public class ProductRepository<T> : IProductRepository where T: new()
{
     T _productEntitiesContext;
     public productRepository()
     {
         _productEntitiesContext = new T();
     }
     public productRepository(T productContext)
     {
         _productEntitiesContext = productContext;
     }
}

不确定硬编码ProductEntities的问题是什么——无论如何,ProductRepository似乎是特定于产品的实现。

如果你想将ProductEntities注入到你的存储库中,而不需要对其进行依赖,那么你可以创建一个标记接口,比如IProductEntities,并在ProductEntities 中实现它

public interface IProductEntities { }
public partial class ProductEntities : IProductEntities { }

记住,尽管ProductEntities是一个生成的类,但您仍然可以向它添加代码,因为它是分部的(顺便说一句,如果它不是分部的,那么您可以简单地从它继承)

如果您真的在考虑可切换的数据上下文,那么您可能想要在IProductEntities接口中添加一些方法。尽管如此,我怀疑是否有必要切换上下文,也不确定谁将提供替代实施。

因为这样的存储库模式无论如何都是对数据访问进行抽象,所以以这种方式抽象EF上下文没有任何价值。明天,如果您想使用另一个OR包装器(如NHibernate),您可能会提供另一个使用其他OR映射器的IProductRepository实现。

如果你想要更深入的抽象层,你可以考虑工作单元和IoC,stackoverflow上有很多例子。linq到sql的例子也适用于实体框架。我个人已经使用Entity框架在几个项目中实现了这一点。如果你感兴趣,值得在下面的链接中阅读有关工作单元和IoC的内容。

DataContext、存储库和工作单元

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

希望这能有所帮助。