4

使用實體框架4.1,並試圖創建上面的存儲庫層作爲測試。基本上我正在玩弄熟悉,因爲我是實體框架和存儲庫模式的新手。我遵循一些教程並創建了一個通用的存儲庫。存儲庫是這樣啓動的:實體框架4.1通用存儲庫

CentralDataRepositoryEntities CentralDataRepositoryEntities = new CentralDataRepositoryEntities(); 

Repository<Group> Rep = new Repository<Group>(CentralDataRepositoryEntities); 
IEnumerable<Group> Groups = Rep.Get<Group>(g => g.JorMGroupId == 114); 

Console.WriteLine(Group.Single()); 

Repository<Job> Rep1 = new Repository<Job>(CentralDataRepositoryEntities); 
IEnumerable<Job> Jobs = Rep1.Get<Job>(j => j.jobId == 2138); 

Console.WriteLine(Job.Single()); 

我更喜歡它,如果我不必每次都啓動一個新的存儲庫。有沒有一種方法可以創建存儲庫,然後使用泛型方法呢?例如:

Repository Rep = new Repository(CentralDataRepositoryEntities); 
IEnumerable<Group> Groups = Rep.Get<Group>(g => g.JorMGroupId == 114); 
IEnumerable<Job> Jobs = Rep.Get<Job>(j => j.jobId == 2138); 

這是個好主意嗎?爲什麼要爲每種類型創建一個單獨的存儲庫,以及創建多個存儲庫的性能如何?

回答

1

只是爲了澄清:你是否想要創建一個可以被多個ORM使用的「通用」存儲庫,還是僅用於EF?如果後者是這樣的模式已經實施,那麼這是浪費時間。 DbContext就是你所說的「工作單元」,它暴露的Set方法是爲特定類型創建一個Repository

一個例子:

using(var ctx = new MyContext()) // Unit of Work 
{ 
    var userRepository = ctx.Set<User>(); // Creates user repository 
    var logRepository = ctx.Set<Log>(); // Creates log repository 
    userRepository.Add(newUser); // Adds a "pending" item to the userRepository 
    logRepositor.Add(logMsg); // Adds a "pending" item to the logRepository 

    ctx.SaveChanges(); // Adds the "pending" items all at once. 
} 

被掛起我的意思的更改不會保存到數據庫中呢。

+1

是的,它只適用於EF。嘲笑和單元測試呢? –

+1

@RichardBanks,Touché。 – ebb

1

擁有這樣的存儲庫將違反Single responsibility principle。單一存儲庫只應負責管理單一類型的實體。

此通用存儲庫模式僅適用於簡單場景。在某些情況下,您需要在特定實體的存儲庫中使用其他方法。