DIP 依赖注入原则


DIP 依赖注入原则 -  IoC 控制反转设计模式 ->实现方式    1. DI 依赖注入 2 . 服务定位   ,  所谓依赖注入就是将 被依赖项(接口)以参数的方式传给(注入)依赖函数


高级层不依赖低层代码


IoC容器是实现了 IoC模式的框架 


还有属性注入 ( 在定义 属性的的外面的class 不能加public )

namespace 依赖倒置原则
{
    public class Order
    {
        private IDal _idal;
        
        public Order(Idal idal)
        {
            _idal=idal;
        }
        public void Add() //Dal是作为抽象接口
        {
           //调用dal的Add()方法
           _idal.Add();

        }
    }
}

namespace 依赖倒置原则
{
    interface IDal
    {
         void Add();
    }
}

namespace 依赖倒置原则
{
    public class SqlServerDal:IDal
    {
        public void Add()
        {
            Console.WriteLine("SqlServer 中增加一条记录");
        }
    }
}

public static void main()
{
      //实例化 order 对象
      SqlServerDal sqlServerDal=new SqlServerDal();
      Order order=new Order(sqlServerDal);
      
      order.Add();
      
      //output
      Console.WriteLine("SqlServer 中增加一条记录");
      


依赖注入(**Dependency Injection**, 简称 DI)是面向对象编程中一种重要的设计模式,也是实现**控制反转(Inversion of Control, IoC)**的一种手段。它的核心思想是:**由外部容器或调用者负责将对象所依赖的其他对象传入,而不是在对象内部自己创建或查找依赖项。** 这种方式可以显著提高代码的可测试性、可维护性和解耦程度。 --- ## ✅ 为什么要使用依赖注入? ### 传统方式的问题: ```cpp class Service { public: void doSomething() { std::cout << "Service is doing something." << std::endl; } }; class Client { private: Service service; // 客户端直接创建依赖 public: void execute() { service.doSomething(); } }; ``` 在这个例子中,`Client` 类直接依赖了 `Service` 类的具体实现。如果将来要替换为 `MockService` 或修改行为,就必须修改 `Client` 的源码。 --- ## ✅ 使用依赖注入的改进版本: ```cpp class IService { public: virtual void doSomething() = 0; virtual ~IService() = default; }; class Service : public IService { public: void doSomething() override { std::cout << "Real Service is doing something." << std::endl; } }; class MockService : public IService { public: void doSomething() override { std::cout << "Mock Service is doing something." << std::endl; } }; class Client { private: IService* service; // 依赖通过构造函数传入 public: explicit Client(IService* svc) : service(svc) {} void execute() { service->doSomething(); } }; ``` ### 使用示例: ```cpp int main() { Service realService; MockService mockService; Client client1(&realService); Client client2(&mockService); client1.execute(); // 输出真实服务 client2.execute(); // 输出模拟服务 } ``` --- ## ✅ 依赖注入的优点 | 优点 | 描述 | |------|------| | **解耦** | 对象不关心具体依赖类,只依赖接口 | | **可测试性强** | 可以轻松注入 Mock 对象进行单元测试 | | **可扩展性强** | 替换实现无需修改调用方代码 | | **便于管理生命周期** | 外部统一管理依赖对象的创建与销毁 | --- ## ✅ 常见的依赖注入方式 ### 1. 构造函数注入(推荐) ```cpp class Client { private: IService* service; public: explicit Client(IService* svc) : service(svc) {} }; ``` ### 2. Setter 注入 ```cpp class Client { private: IService* service = nullptr; public: void setService(IService* svc) { service = svc; } }; ``` ### 3. 接口注入(较少使用) 定义一个注入接口供依赖对象实现。 --- ## ✅ 在实际项目中的应用 - **Spring (Java)**: 提供强大的依赖注入框架 - **ASP.NET Core (.NET)**: 内建支持依赖注入 - **C++**: 虽无内建机制,但可通过构造函数手动注入或使用第三方库如 Boost.DI、DIP/cpp 实现 --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值