2012-03-26 45 views
3

在我的應用程序中,我創建了一個帶有Repository類的DAL。存儲庫使用一組EF類作爲數據上下文如何在C#中抽象實體數據上下文

我想以創建一個抽象爲能夠使用多個數據上下文相同存儲庫的。我用下面的代碼來初始化上下文(ProductEntities是EF上下文):

public class ProductRepository : IProductRepository 
{ 
    ?type? _productEntitiesContext; 

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

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

但我不知道_productEntitiesContext(和productContext)類型。 ProductEntities繼承自ObjectContext

爲了實現抽象我一直使用的接口,我不知道我是否可以使用ObjectContext,因爲它是一個類。

有人知道我的目標是否可以實現?

回答

2

這樣的事情?

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

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

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

謝謝。有了這個,你可以定義一個泛型類型T.我想定義類似於接口的東西,比如IProductRepository,但是用於上下文。 – CiccioMiami 2012-03-26 12:37:45

1

不知道什麼是硬編碼ProductEntities這裏的問題 - ProductRepository反正似乎是產品的具體實施。

如果要注入ProductEntities到你的倉庫W/O服用依賴於它,那麼你可以創建一個標記接口,如IProductEntities和實施,在ProductEntities

public interface IProductEntities { } 

public partial class ProductEntities : IProductEntities { } 

記住,雖然ProductEntities是一個生成的類,你仍然可以添加代碼,因爲它的部分(作爲一個旁註,如果它不是部分,那麼你可以簡單地繼承它)

如果你真的想想你可能會想要添加一些方法到IProductEntities接口g可切換的數據上下文。儘管我懷疑是否需要改變背景,但我不確定誰會提供替代實施。

因此庫模式反正抽象的數據訪問,所以不要看到這樣抽象EF方面的任何值。明天,如果你想使用另一個OR包裝器(比如NHibernate),你可以提供另一個使用其他OR映射器的實現。

+1

好的,謝謝,我還想知道是否值得抽象背景。我以爲有一個界面已經定義好了,因爲事實並非如此,我會保持原樣 – CiccioMiami 2012-03-26 12:43:31

1

如果你是抽象後的又一層,你可以考慮單位的工作和IOC,有計算器上的很多例子。 linq-to-sql的例子也適用於實體框架。我親自在一些使用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

希望這可以幫助。