2014-07-15 23 views
0

下面的ProductService类从数据库获取基于不同过滤器(如日期,国家等)的产品。 ProductsService不遵循OCP,因为添加新的过滤器(如按价格获取产品)需要更改ProductsService代码。如何修复?任何建议/意见将非常有帮助。针对不同过滤器条件的开放闭合原理

public class ProductsService : IProductsService 
{ 
    public FilteredProducts GetProductsByDate(DateTime startDate, DateTime EndDate) 
    { 
     //..... 

    } 
    public FilteredProducts GetProductsByCountry(string country) 
    { 
     //..... 

    } 

    public FilteredProducts GetProductsByCity(string city) 
    { 
     //..... 

    } 

} 

public class FilteredProducts 
{ 
    public IEnumerable<Product> Products{set;get;} 
    public int uniqueProducts { set; get; } 
} 

public class Product 
{ 
    public int ID{set;get;} 
    public string Name{set;get;} 
    public decimal Cost{set;get;} 
} 

回答

0

最好的方法是将每个操作表示为单独的类。

public interface IProductFilter 
    { 
     FilteredProducts GetProducts(); 
    } 

    public class GetProductsByDate : IProductFilter 
    { 
     private DateTime _startDate; 
     private DateTime _endDate; 

     public GetProductsByDate(DateTime startDate, DateTime EndDate) 
     { 
      _startDate = startDate; 
      _endDate = EndDate; 
     } 

     public FilteredProducts GetProducts() 
     { 
      // filter 
     } 
    } 

然后,您可以将此实现传递到您的服务中,并在其中执行。

public class ProductsService : IProductsService 
    { 
     public FilteredProducts FilterProducts(IProductFilter filter) 
     { 
      // execute the filter 
      // return the products 
     } 
    } 

你甚至可以去尽可能把它变成通用的命令(例如here),并通过它执行所有的数据库逻辑,抛弃了“服务”反模式。

-3

这里的要求是为每个新的过滤器添加算法而不改变服务等级。战略模式符合这一要求。希望这是有帮助的。

+0

其实不,它没用。请在您的描述中添加更多细节(如何操作,而不是如何操作),并且包含一些代码,因为原始的海报会尽力实现。 –

+0

对不起。我的错。用户“不安”在几分钟前添加了上述模式的示例代码。 – Brijesh

0

我将有一个接口调用IFilter,它负责FilterConstraints合同。

public interface IFilter 
    { 
     void FilterConstraints(String FilterConstraints); 
    } 

然后,我会有负责过滤的类,并让这些类实现IFilter Inetrface。

public class FilterByCountry : IFilter 
{ 
    public void FilterConstraints(string FilterConstraints) 
    { 
     //**Your Filter Constraints**/ 
    } 
} 

public class FilterByCity : IFilter 
{ 
    public void FilterConstraints(string FilterConstraints) 
    { 
     /**Your Filter Constraints **/ 
    } 
} 

这是有一个构造函数的主类,初始化的IFilter(这是各种FilterClassed中常见)

public class ProductService 
{ 
    private IFilter _filter=null; 

    public ProductService(IFilter Filter) 
    { 
     _filter = Filter; 
    } 


    public void FilterProducts(String Constraints) 
    { 
     _filter.FilterConstraints(Constraints); 
    } 
} 

所以,如果你想打电话Filterbased上FilterByCountry现在,它会像

var filterbycountry=new FilterByCountry(); 
var Filter=new ProductService(filterbycountry); 
filter.FilterProducts("your constraints"); 

美中不足的是,如果你想添加一个过滤器,你得有一个新的类,并实现IFilter的该过滤器类,并从product.That调用的就是你r扩展但不修改类,保留开放和关闭原则

+0

我将增加更多的解释..迟到办公室.. – Rangesh

+0

如果你有多个过滤器,但只有一个服务,这不会真正起作用。而当你的服务是长寿/单身。通常情况下是这样。 – Euphoric