2012-05-09 55 views
0

我對每個實體都有單獨的存儲庫類。現在我想在使用存儲庫實例的域對象上實現一些靜態方法,但是這種方法的缺點是我必須在靜態變量上存儲存儲庫實例(這在Web應用程序中不適用),或者我必須創建每個靜態方法的新實例。對此有沒有更好的方法(即用存儲庫實例在域類上實現靜態方法)?請分享你的想法。具有存儲庫的域/模型對象的靜態方法

基地存儲庫:

public abstract class AbstractRepository<TEntity> : IabstractRepository<TEntity> 
    where TEntity : EntityObject 
{ 
    protected CivilRegistryEntities civilContext; 

    public AbstractRepository() 
    { 
     civilContext = CivilRegistryEntities.Instance; // Per HTTP request singletone. 
    } 

    // Other method implementation goes here. 
} 

每實體存儲庫:

public class BirthReportRepository : AbstractRepository<BirthReport> 
{ 

} 

域/實體/模型對象:

public partial class BirthReport 
{ 
    //Not works well in web application. 
    private static BirthReportRepository repository = new BirthReportRepository(); 

    public static BirthReport Method1() 
    { 
     return repository.SomeMethod(); 
    } 

    public static BirthReport Method2() 
    { 
     return repository.SomeOtherMethod(); 
    } 

    // Other methods(both static and instance) goes here. 
} 

回答

1

靜態可變狀態是可怕的。期。存儲庫包含一個上下文,上下文包含大量的可變狀態。除此之外,環境應該有一個短的生命週期。並且:我認爲您的域應該與存儲庫無關。這是僞封裝。相反,讓域服務處理方法1,方法2。

您可以考慮使用IoC容器將上下文注入到您的存儲庫和存儲庫中,並將其注入到您的域服務中。 IoC容器也可以處理上下文和存儲庫的生命週期。對於Web,每個請求的實例很常見。

+0

存儲庫包含低級別操作(LINQ to SQL),基本存儲庫(AbstractRepository )實現基本的CRUD操作。我認爲直接在域類上處理所有方法將只是代碼的重複!好吧,IoC可能是一個不錯的選擇。 – NaveenBhat

+0

_simply重複code_我不確定你的意思,是好還是壞?無論如何,你可以在任何地方使用靜態方法。如果你想使用靜態方法(這可能是完全合理的),我寧願將它們放在靜態類中,這顯然是一個實用工具(或服務)類。但除此之外,我認爲保持你的語境短暫是好的做法。也保持靜態方法無狀態。 –

+0

插入,更新select-by-primary鍵,全選,刷新是我不想在每個域對象上重複的常用方法。因此,我創建了基本存儲庫來執行這些任務和派生存儲庫,以執行其他低級任務。這些不是靜態的。 – NaveenBhat