在我的应用程序中,我使用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
,因为它是一个类。
有人知道我的目标是否可以实现?
答案 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的信息。
希望这会有所帮助。