我正在尝试弄清楚是否可以在使用Entity Framework 4.0时坚持“针对接口编程,而不是实现细节”的口号。
虽然我找到了一篇关于如何在使用Linq-to-SQL时遵循上述规则的页面(点击此处),但我非常想知道是否可以在使用Entity Framework(也使用Linq)时做到这一点。
以下是通常的用法:
var query = from pages in dataContext.Pages where pages.IsPublished select pages;
foreach (Page page in query)
{
// do something with page...
var routeQuery = from routes in page.Route where route.IsValid select routes;
foreach (Route route in routeQuery)
{
// do something with route
}
}
但我希望像这样使用它:
var query = from pages in dataContext.Pages where pages.IsPublished select pages;
foreach (IPage page in query)
{
// do something with page...
var routeQuery = from routes in page.Route where route.IsValid select routes;
foreach (IRoute route in routeQuery)
{
// do something with route
}
}
基本上,我想通过使用接口将实体框架的DataContext从实例化它的程序集/子系统中传递出去。 提供的所有数据上下文信息都应以接口形式而不是实际类形式呈现。
我想保持实现实体的实际类内部,并仅公开它们实现的接口。
实体框架能否实现这一点? 如果不能,请问还有其他可以以这种方式使用的O / R映射器吗?
如果这不是进一步分离数据库与实际应用程序的好方法,我很乐意听取您的建议。
IRepository<T>
的根接口,它定义了添加、查找、删除等操作。然后在我的DI中,我说“如果有人请求IRepository<Person>
,则给他们GenericRepository<Person>
。这是另一个实现接口的泛型类。很酷吧? - RPM1984personService.Find(p => p.Name == "Bob");
,这将调用服务层(PersonService),然后服务层会执行repository.Find(predicate).SingleOrDefault();
。但是,我喜欢使用修改过的规约模式来定义搜索操作(更少的维护工作、更多的灵活性和功能性,这也是我使用IQueryable的原因)。当然,你不必这样做。这取决于谁在使用你的存储库。 - RPM1984ICollection<IPage> list
中。正如我所说,您会失去延迟执行/IQueryable。 - RPM1984