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;}
}
4

3 回答 3

1

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

    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
        }
    }

您甚至可以将其变成通用命令(例如此处)并通过它执行所有数据库逻辑,从而放弃“服务”反模式。

于 2014-07-15T04:09:37.067 回答
0

我会有一个名为 IFilter 的接口,它负责 FilterConstraints Contract。

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);
    }
}

所以现在如果你想基于 FilterByCountry 调用 Filter,它就像

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

Catch 是,如果您想再添加一个过滤器,您将拥有一个新类并将 IFilter 实现到该过滤器类并从产品中调用它。这是您扩展但不修改类,保持开放和封闭原则

于 2014-07-15T03:52:35.507 回答
-3

这里的要求是在不改变服务类的情况下为每个新过滤器添加算法。策略模式符合这一要求。希望这会有所帮助。

于 2014-07-15T03:23:06.223 回答