gpt4 book ai didi

c# - 针对接口(interface)和 Entity Framework 4.0 进行编程

转载 作者:太空狗 更新时间:2023-10-29 20:22:17 25 4
gpt4 key购买 nike

我正在尝试弄清楚是否有可能坚持“针对接口(interface)而非实现编程”的口头禅。在使用 Entity Framework 4.0 时。

虽然我找到了一个页面来解释如何在使用 Linq-to-SQL ( look here ) 时遵守上述规则,但我非常想知道是否可以使用 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
}
}

本质上,我希望能够将 Entity Framework 的 DataContext 传递到程序集/子系统之外,在该程序集/子系统中使用接口(interface)实例化它。数据上下文提供的所有信息都应该以接口(interface)的形式出现,而不是实际的类。

我想保留实现程序集内部实体的实际类,并且只公开它们实现的接口(interface)。

Entity Framework 可以做到这一点吗?如果没有,是否有任何其他 O/R 映射器可以以这种方式使用?

如果这不是进一步将数据库与实际应用程序分离的好方法,我很想听听您的建议。

最佳答案

一个更好的解决方案(在我看来)是执行以下操作:

为您的实体数据模型创建存储库,公开 ICollection<T>IQueryable<T>

在您的存储库上使用接口(interface):

public interface IRepository
{
public ICollection<Person> Find(string name); // tighter, more maintanability
public IQueryable<Person> Find(); // full power! but be careful when lazy loading

由于接口(interface)的缘故,您可以换入换出模拟,其他 ORM:

public class MockRepo : IRepository
{
public List<Person> persons; // mimics entity set
}

您只能抽象出这么多。

如果您担心使用 ObjectSet(绑定(bind)到 EF),请使用 POCO。

查看我的一些其他问题以获取更多信息(因为我们现在正在构建此架构)。

另外,考虑使用依赖注入(inject)。在这里,您可以从管理 ObjectContext 的业务中获取存储库 - 您可以将存储库注入(inject)一个工作单元(它是 ObjectContext 的包装器 - 因此多个存储库或聚合根可以处理相同的上下文)。

在我们的解决方案中,除了位于单独程序集中的存储库之外,没有任何内容涉及 Entity Framework (或任何持久性逻辑)。

HTH.

关于c# - 针对接口(interface)和 Entity Framework 4.0 进行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3931375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com