【问题标题】:Is it right to use extension methods in my case?在我的情况下使用扩展方法是否正确?
【发布时间】:2012-12-22 15:34:52
【问题描述】:

我在我的项目中使用 MVC4 和实体框架 5,并且我有很多表。作为我们项目的规则,我们不会从数据库中删除任何记录,每条记录都有一个 isActive 字段,如果该字段为 false,则认为它已删除。我想编写一个扩展方法来获取活动记录,经过一番谷歌搜索后,我写了这个:

public static IQueryable<Company> GetAll(this IQueryable<Company> source)
{
   return source.Where(p => p.isActive);
}

现在我可以使用我的扩展方法只获取活动记录,例如

Context db = new Context();
db.Company.GetAll();

但是假设我的数据库中有 50 多个表,为我的每个表编写相同的扩展方法是否是一种好方法。有没有更好的方法来为我们所有的表编写一个只有一个 GetAll() 扩展方法?实际上我什至不确定在这个实例中使用扩展方法是否正确?

有人可以帮助我并告诉我正确的方法吗?如果您能提供代码示例,我将不胜感激。

【问题讨论】:

    标签: asp.net-mvc entity-framework extension-methods


    【解决方案1】:

    这取决于你如何使用实体框架,如果你依赖于普通的生成器(我认为你这样做),你的案例会变得更难,我从来没有过类似的案例研究。但是,如果您使用普通的 POCO 类生成器,您可以使用基类,我们称之为 CEntity,它是您的其他每个类(表)的基类。

    我们到了吗?不,要继续这个,我更喜欢使用存储库模式,您可以使该存储库通用(CEntity),例如:

    public class Repository<CEntity> where CEntity : class
    {
        public IQueryable<CEntity> GetAll()
        {
           return source.Where(p => p.isActive);
        }
    
    }
    

    这是如何使用它:

    Repository<Company> com = new Repository<Company>();
    Repository<Employee> emp = new Repository<Employee>();
    
    var coms = com.GetAll();    // will get all ACTIVE companies
    var emps = emp.GetAll();    // will get all ACTIVE employees
    

    这不在我的头上,如果您有任何其他问题,请将它们作为 cmets,很乐意提供帮助。

    【讨论】:

    • 感谢您的快速答复 LordCover。我使用数据库优先方法。 EF5.x DbContextGenerator 是普通的 POCO 类生成器吗?如果没有,我在哪里可以找到普通的 POCO 类生成器?顺便说一句,在您的示例中,没有“来源”的定义。
    • 我知道,source 只是对象集合,它是对象的集合。
    • 但是我们怎么说它有 isActive 字段呢?编译器给出了“没有这样的字段”之类的错误?我想我必须投到 Company 类,但什么都不会改变,那么我必须为我的所有表都这样做??
    • 那么你必须使用泛型(匿名类型)和反射从对象中获取字段“isActive”的值。
    【解决方案2】:

    作为一个兴趣点,这正是我实现数据层的方式,我认为它很棒:)

    我也在中间堵塞了一个存储库,但一般概念应该可以使用或不使用。

    以下是一些工作代码示例,说明了我如何在我的博客中将这种方法用于一些类似的用例。

    https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/Entities/Post/PostRepositoryExtensions.cs

    我发现它可以编写一些非常优雅的代码,同时仍然不会过多地限制您可以做的事情。就像我说的,我觉得这个方法很棒,真的很推荐它的用法。

    【讨论】:

    • 感谢 Luke 的示例项目。有很多事情我不明白(也许更多)。是为每个存储库创建数据库上下文类还是存储库共享一个数据库上下文类(仅创建一个上下文)?
    • 是的,我想我的示例有点复杂,因为我使用的是通用存储库。下面有一个 DbContext (github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/…),但是如果通过扩展 IQueriable 或 IDbSet 对您更有效,您实际上可以在不使用存储库的情况下执行相同的扩展方法。
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2012-08-11
    • 2015-03-22
    相关资源
    最近更新 更多