2011-06-03 82 views
1

我有EF的实体,称为注册,我用投掷各种有用的东西在我的典型的查询看起来是这样的:抽象访问实体框架

db.Registry 
    .Where(x => x.Domain == "SomeDomain" && x.Key == "SomeKey") 
    .Select(x => x.Value) 
    .Single(); 

其中db是类型的变量EFContainer。而不是所有的地方这种查询我想写点东西简单多了,也许是这样的:

Registry.Get(Key: "SomeKey", Domain: "SomeDomain") 

,但问题是,为了使这种方式来访问它需要实例EFContainer数据库当它发生时,我开始有IEntity更改跟踪器无法处理第二个连接的错误。我想我可以通过我的db变量的方法,但这是eeky。

完成此操作的好方法是什么?

回答

3

执行此操作的典型方法是创建一个RegisterRepository并将EFContainer注入到存储库的构造函数中或注入一个用于创建容器的机制。

public class RegistryRepository { 
public RegistryRepository(EFContainer db) { 
    this.db = db; 
} 

readonly EFContainer db; 

public Registry Get(string domain, string key) { 
// implementation here 
} 

} 

在此实现中,您必须考虑如何获取对存储库的引用以及如何构建存储库。您可以使用dependency injection框架将EF容器和存储库注册为适当的生命周期范围。例如,如果您正在开发一个ASP.NET应用程序,则EF上下文将以存储库的HTTP请求为范围。

+0

所以没有必要通过容器。叹息......但感谢依赖注射的链接! (对我来说是新的东西) – ekkis 2011-06-04 17:52:58

+0

顺便说一句,我发现真正没有问题实例化容器两次,只要你不混合它们即object-from-container-1.property = object-from-容器2 – ekkis 2011-06-04 18:03:27