我正在做一些R& D工作,因此正在探索设计模式。我最近一直在阅读规范模式,并参考了this伟大的文章。
我对代码的简洁性和清洁度很感兴趣,但我开始比较使用其他技术实现相同的清洁度。
考虑服务层的以下接口合同:
public interface IFooDataService
{
ICollection<Foo> GetFoosBySpecification(Specification<Foo> specification);
ICollection<Foo> GetFooByPredicate(Func<Foo,bool> predicate);
ICollection<Foo> GetFooBySearchArgs(FooSearchArgs searchArgs);
}
所以,一些初步要点:
现在,进入实施:
public ICollection<Foo> GetFoosBySpecification(Specification<Foo> specification)
{
return fooDataRepository
.Find()
.Where(f => specification.IsSatisfiedBy(f))
.ToList();
}
public ICollection<Foo> GetFooByPredicate(Func<Foo, bool> predicate)
{
return fooDataRepository
.Find()
.Where(predicate)
.ToList();
}
public ICollection<Foo> GetFooBySearchArgs(FooSearchArgs searchArgs)
{
return fooDataRepository
.Find()
.WhereMeetsSearchCriteria(searchArgs)
.ToList();
}
实施要点:
那就是说,在什么条件下你会使用上述3种技术之一?
我对规范模式的看法:
我对扩展方法(管道和过滤器)的想法:
我对谓词方法的看法:
我最后的思考逻辑是,如果您正在开发一个复杂的业务应用程序,其中业务需求是预先知道的,但可能会随着时间而变化,那么我会使用规范模式。
但是对于一个“启动”的应用程序,即需求会随着时间的推移而发展,并且有多种方法可以在没有复杂验证的情况下检索数据,我会使用管道和过滤器方法。
你有什么想法?你有没有遇到任何上述方法的问题?有什么建议吗?
即将开始一个新项目,因此这些类型的考虑因素至关重要。
感谢您的帮助。
编辑规范模式的澄清
以下是规范模式的相同用法。
Specification<Foo> someSpec; // Specification is an abstract class, implementing ISpecification<TEntity> members (And, Or, Not, IsSatisfiedBy).
someSpec = new AllFoosMustHaveABarSpecification(); // Simple class which inherits from Specification<Foo> class, overriding abstract method "IsSatisfiedBy" - which provides the actual business logic.
ICollection<Foo> foos = fooDataService.GetFoosBySpecification(someSpec);
答案 0 :(得分:2)
根据我的小经验:
答案 1 :(得分:0)
好吧,首先我会编写Predicate方法,即使它只用作其他两个的私有实现细节:
private ICollection<Foo> GetFoosBySpecification(Specification<Foo> spec)
{
return GetFooByPredicate(f => spec.IsSatisfiedBy(f));
}
搜索参数函数将是一个类似的单行。
除此之外,我真的不能抽象地说什么。我必须更多地了解数据结构,以确定寻找它们的最佳方式。