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

标签 c# .net entity-framework interface entity-framework-4

我正在尝试弄清楚是否有可能坚持“针对接口(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/

相关文章:

c# - SendInput Ctrl + C 然后通过 Clipboard.GetText 检索复制的内容不起作用

c# - 尽管在本地主机上工作,部署到 Azure 时 Azure Active Directory 始终重定向到 '~/.auth/login/done'

c# - 如何在 Windows 8.1 中获取 MessageBox 图标

C# Entity Framework - 如何获取指定为参数的列

c# - 嵌套类没有命名空间

c# - 通缉 : List of data following certain rules concerning dates

c# - NHibernate:如何使用 CreateSQLQuery 返回标量值列表(从一列)?

c# - 在 ServiceStack Razor View 中获取 HttpCompileException(自托管)

c# - Entity Framework : Migration classes missing from list of pending explicit migrations after moving them to the migrations folder

性能 linq group by 带计数