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。单一存储库只应负责管理单一类型的实体。

此通用存储库模式仅适用于简单场景。在某些情况下,您需要在特定实体的存储库中使用其他方法。