DIP(Dependency Inversion Principle) 是一种设计原则.
定义
- 高层不应该依赖底层, 他们都应该依赖抽象.
- 抽象不应该依赖细节, 细节应该依赖抽象.
举例
public class CustomerBusinessLogic
{
public CustomerBusinessLogic()
{
}
public string GetCustomerName(int id)
{
DataAccess _dataAccess = DataAccessFactory.GetDataAccessObj();
return _dataAccess.GetCustomerName(id);
}
}
public class DataAccessFactory
{
public static DataAccess GetDataAccessObj()
{
return new DataAccess();
}
}
public class DataAccess
{
public DataAccess()
{
}
public string GetCustomerName(int id) {
return "Dummy Customer Name"; // get it from DB in real app
}
}
存在的问题.
- 高层对象
CustomerBusinessLogic
依赖具体的底层对象DataAccess
. 他们都应该依赖于他们的抽象.
解决方法
CustomerBusinessLogic
依赖与他的抽象ICustomerDataAccerror
DataAccess
依赖于他的抽象IDataAccess
.CustomerBusnessLogic
不应该依赖具体的对象DataAccess
, 而应该依赖于他的抽象IDataAccess
public interface ICustomerDataAccess
{
string GetCustomerName(int id);
}
public class CustomerDataAccess: ICustomerDataAccess
{
public CustomerDataAccess() {
}
public string GetCustomerName(int id) {
return "Dummy Customer Name";
}
}
public class DataAccessFactory
{
public static ICustomerDataAccess GetCustomerDataAccessObj()
{
return new CustomerDataAccess();
}
}
public class CustomerBusinessLogic
{
ICustomerDataAccess _custDataAccess;
public CustomerBusinessLogic()
{
_custDataAccess = DataAccessFactory.GetCustomerDataAccessObj();
}
public string GetCustomerName(int id)
{
return _custDataAccess.GetCustomerName(id);
}
}