【问题标题】:So many criteria这么多标准
【发布时间】:2012-05-04 16:22:08
【问题描述】:

我正在开发一个为互联网用户提供一些服务的互联网网站。所以我们有一个管理系统,我的业务团队的合作者可以在其中获得他们想要的信息,例如过去 3 天有多少新用户注册?或者发表了多少带有“笑话”标签的文章等。因此在管理系统中,有几个页面用于搜索一些带有条件的表格。这些页面非常相似:


UserID:[-------------] Nick Keyword:[------------] 注册时间:[BEGIN]~[END] [搜索]


这里列出了搜索结果


User 类具有更多属性,而不仅仅是 UserID/Nick/RegisterTime(以及用户表),但只有 3 个属性被视为条件。所以我有一个UserSearchCriteria 类,例如:

public class UserSearchCriteria
{
    public long UserID { get; set; }
    public string NickKeyword { get; set; }
    public DateTime RegisteredTimeStart { get; set; }
    public DateTime RegisteredTimeEnd { get; set; }
}

然后在数据访问层,search方法接受一个类型为UserSearchCriteria的参数,并构建对应的Expression<Func<User, bool>>进行查询。而在 DAL 之外,其他开发者只能通过条件提供的 3 个条件搜索用户表,例如,他们无法搜索 City 属性为“纽约”的用户(这通常是因为该属性有数据库中没有索引,用它搜索很慢)。

问题一:这种封闭搜索的实现是否正确?有什么建议吗?

问题2:现在我在项目中发现了更多的标准类,比如ArticleSearchCriteriaFavouriteSearchCriteria等等,我认为未来标准会越来越多。它们具有几乎相同的工作机制,但我需要重复代码。有没有更好的解决方案?

P.S.如果你需要这些信息:jQuery + ASP.NET MVC 3 + MongoDB

【问题讨论】:

    标签: c# asp.net-mvc-3 data-access-layer business-logic-layer


    【解决方案1】:

    对我来说很有意义。如果用户无法通过“任何内容”进行搜索,那么使用按模板搜索的方法就没有任何意义。此外,如果你试图让它更通用,它会变得非常混乱。例如,我不想编写如下代码:

    class SearchCriteria{
       Dictionary<object,object> KeyValuePairs;
       EntityKind Entity;
    }
    

    这样使用:

    SearchCriteria sc = new SearchCriteria();
    sc.KeyValuePairs.Add("UserId",32);
    sc.Entity = EntityKind.User;
    

    哎呀。没有编译时类型检查,没有检查实体和属性是否匹配等。

    所以,我的回答是,是的 :),我会使用您当前使用的设计模式。对我来说很有意义,而且任何人都可以直接看到你在做什么并跟上进度。

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 2011-10-19
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多