如何在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
,因为它是一个类。
有人知道我的目标是否可以实现吗?
类似的东西?
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
希望这能有所帮助。