RPM*_*984 7 architecture extension-methods design-patterns specification-pattern pipes-filters
我正在做一些研发工作,因此正在研究设计模式.我最近一直在阅读规范模式,并参考了这篇伟大的文章.
我对代码的简洁性和清洁度很感兴趣,但我开始比较使用其他技术实现相同的清洁度.
考虑以下服务层的接口合同:
public interface IFooDataService
{
ICollection<Foo> GetFoosBySpecification(Specification<Foo> specification);
ICollection<Foo> GetFooByPredicate(Func<Foo,bool> predicate);
ICollection<Foo> GetFooBySearchArgs(FooSearchArgs searchArgs);
}
Run Code Online (Sandbox Code Playgroud)
所以,一些初步要点:
现在,进入实施:
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();
}
Run Code Online (Sandbox Code Playgroud)
实施要点:
那么,话虽如此,在什么条件下你会使用上述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);
Run Code Online (Sandbox Code Playgroud)
从我的一点经验来看: