当我开始时,我有一个界面:
public interface IBlogReader
{
BlogPost GetLatest();
IEnumerable<BlogPost> FindByDate(DateTime from, int limit);
IEnumerable<BlogPost> FindByCategory(string category, int limit);
IEnumerable<BlogPost> FindByAuthor(string author, int limit);
}
然后我需要不同的查询排列(FindByAuthorWithCategory,FindByDateWithAuthor等)我认为我需要改变方法,因为这会不断增长。我需要更多不同的查询。接下来我有一个界面,如:
public struct FindCriteria
{
DateTime? from;
string category;
string author;
}
public interface IBlogReader
{
BlogPost GetLatest();
IEnumerable<BlogPost> Find(FindCriteria criteria);
}
界面较小,我可以避免制作很多方法。但是,我基本上将许多方法实现转移到了一个大喇叭单方法实现中。这让我感觉好一阵子。我正在考虑采用一种将大喇叭查询方法包装到一系列单个对象中的方法,其中每个对象处理特定内容并且我要求结果:
public abstract class QueryCommand
{
protected IBlogReader reader = null;
public QueryCommand(IBlogReader reader)
{
this.reader = reader;
}
public abstract void Execute();
}
public class GetLatest : QueryCommand
{
public BlogPost GetResults();
public void Execute();
}
public class FindByDate : QueryCommand
{
public IEnumerable<BlogPost> GetResults();
public void Execute();
}
它仍然感觉不对。我读到了Repository模式,但我看不出它是如何应用的。在我看来,我最终还是会采用很多方法。数据存储在云中。使用规范模式会非常沉重,因为我对它的阅读会使所有记录都符合资格。在另一次尝试中,我创建了单独的DAO对象,并将它们包装在类似于知识库的外观对象中。最终结果与我开始时的结果相同......许多方法......但是存储库没有完成所有工作。
我应该只是解决自己有多种方法或许多对象并克服它?
答案 0 :(得分:0)
看起来像Query Object。 有时候我们也会使用它的变体:
public class Filter
{
public DateTime? PostDate { get; set; }
public DateTime? LastComment { get; set; }
public string Author { get; set; }
}
然后解析非空条件以过滤表达式。
答案 1 :(得分:0)
为什么不公开IQueryable<BlogPost>
?您描述的问题正是这种方法有意义的原因。
这是您的界面,已修改:
public interface IBlogReader
{
IQueryable<BlogPost> Posts { get; }
}
然后你可以执行查询:
IBlogReader myReader = new MyReader();
var latest = myReader.Posts.Last();
var posts = myReader.Posts.Where(x => x.Author == "John Smith");
等等。
请注意,已经有许多支持此应用程序的数据访问解决方案,例如LINQ to SQL,Entity Framework或NHibernate。