我在EF中有一个名为Registry的实体,用于抛出各种有用的东西。我的典型查询如下所示:
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
变量传递给方法,但这是非常的。
实现这一目标的好方法是什么?
答案 0 :(得分: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请求确定范围,就像存储库一样。