这么多标准

时间:2012-04-24 02:29:24

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

我正在建立一个互联网网站,为互联网用户提供一些服务。所以我们有一个管理系统,我的业务团队的合作者可以从中获得他们想要的信息,例如:过去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; }
}

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

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

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

P.S。如果您需要以下信息:jQuery + ASP.NET MVC 3 + MongoDB

1 个答案:

答案 0 :(得分:0)

对我来说很有意义。如果用户无法通过“任何东西”进行搜索,那么使用逐个模板的方法就没有任何意义。此外,如果你试图使这更通用,它将彻底混淆。例如,我不愿意编写类似的代码:

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

这样使用:

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

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

所以,我的答案是,是的:),我会使用你目前使用的设计模式。对我来说很有意义,而且对于任何人来说,看看你正在做什么并加快速度似乎很简单。