Tag: specification pattern

在规范中组合C#代码和数据库代码

有时您需要定义一些业务规则,而规范模式是一个有用的工具。 例如: public class CanBorrowBooksSpec : ISpecification { public bool Satisfies(Customer customer) { return customer.HasLibraryCard && !customer.UnpaidFines.Any(); } } 但是,我经常发现我需要将这些规则“推送”到SQL中以提高性能或满足分页记录列表等内容。 然后我不得不为规则编写代码两次,一次在CLR代码中,一次在SQL(或ORM语言)中。 你如何组织这样的代码? 如果代码在同一个类中保存在一起似乎是最好的。 这样,如果开发人员更新业务规则,他们忘记更新两组代码的可能性就会降低。 例如: public class CanBorrowBooksSpec : ISpecification { public bool Satisfies(Customer customer) { return customer.HasLibraryCard && !customer.UnpaidFines.Any(); } public void AddSql(StringBuilder sql) { sql.Append(@”customer.HasLibraryCard AND NOT EXISTS (SELECT Id FROM CustomerUnpaidFines WHERE […]

如何在列表中应用多个过滤条件(同时)?

我使用.Net 4.0框架跟随C#代码。 这是在参考规范模式后由Jeff Perrin创建的 在GetProducts()中,要使用的条件在方法内定义(硬编码)。 还有另一种名为GetProductsBasedOnInputFilters()方法。 在此方法中,规范列表作为方法的参数。 题 在此方法中,在产品列表中应用这些filter的最佳方法是什么? 注意 :我尝试在foreach循环中应用FindAll子句并将结果添加到list 。 但是这种逻辑是不正确的 – 只需要返回那些满足所有条件的项目。 注意 :productSpeifications列表中的规格数量会因用户输入而异 注意 :“ 为Any()方法动态构建LINQfilter? ”中提到的方法似乎很有用。 但是我不知道如何在这里使用这种方法,因为我正在处理specifications列表; 不是generic delegates 。 过滤方法 public static class ProductFilterHelper { public static List GetProducts(List list) { double priceLimit = 100; //FIRST:: //List selectedList = list.FindAll(new OnSaleSpecification().IsSatisfiedBy); //SECOND:: //AndSpecification spec = new AndSpecification(new OnSaleSpecificationForProduct(), new […]

如何动态组合条件?

此问题是对已经回答的问题的增强如何在列表中应用多个过滤条件(同时)? 在上面提到的问题中,我们有一个方法,在所有规范上应用AND运算符。 这是通过在规范上使用LINQ All运算符来实现的。 public static List GetProductsUisngAndFilters(List productList, List<Specification> productSpecifications) { return productList.Where(p => productSpecifications.All(ps => ps.IsSatisfiedBy(p))).ToList(); } 我们需要创建一个能够执行AND , OR和NOT规范(以及它的混合)的新方法(GetProductsUisngDynamicFilters)。 知道怎么解决这个问题吗? 过滤方法 public static class ProductFilterHelper { public static List GetProductsUisngAndFilters(List productList, List<Specification> productSpecifications) { return productList.Where(p => productSpecifications.All(ps => ps.IsSatisfiedBy(p))).ToList(); } } 客户 class Program { static void Main(string[] args) { List […]