当前位置: 首页 > wzjs >正文

到哪个网站找内控制度建设深圳seo优化推广公司

到哪个网站找内控制度建设,深圳seo优化推广公司,可信的大连网站建设,淘金网站建设推广依赖注入(DI)是一种实现低耦合的重要技术,它通过外部提供依赖对象,而不是在类内部直接创建。以下是 C 实现依赖注入的几种方式: 1. 构造函数注入(Constructor Injection) 最常用的 DI 方式&am…

依赖注入(DI)是一种实现低耦合的重要技术,它通过外部提供依赖对象,而不是在类内部直接创建。以下是 C++ 实现依赖注入的几种方式:

1. 构造函数注入(Constructor Injection)

最常用的 DI 方式,依赖通过构造函数传入。

// 依赖接口(抽象类)
class Logger {
public:virtual ~Logger() = default;virtual void log(const std::string& message) = 0;
};// 具体实现:控制台日志
class ConsoleLogger : public Logger {
public:void log(const std::string& message) override {std::cout << "[LOG] " << message << std::endl;}
};// 业务类(依赖 Logger)
class OrderService {
private:Logger& logger_;  // 依赖抽象,而非具体实现
public:// 通过构造函数注入依赖OrderService(Logger& logger) : logger_(logger) {}void processOrder() {logger_.log("Processing order...");// 业务逻辑...}
};// 使用
int main() {ConsoleLogger consoleLogger;  // 依赖的具体实现OrderService orderService(consoleLogger);  // 注入依赖orderService.processOrder();return 0;
}

优点

  • 依赖关系清晰,强制要求提供依赖。
  • 适合必须依赖的情况(如日志、数据库访问)。

2. Setter 方法注入(Setter Injection)

适用于可选依赖,或依赖可能在运行时变更的情况。

class OrderService {
private:Logger* logger_ = nullptr;  // 使用指针(或 std::optional)
public:// Setter 注入void setLogger(Logger& logger) {logger_ = &logger;}void processOrder() {if (logger_) {logger_->log("Processing order...");}// 业务逻辑...}
};// 使用
int main() {ConsoleLogger consoleLogger;OrderService orderService;orderService.setLogger(consoleLogger);  // 动态注入依赖orderService.processOrder();return 0;
}

优点

  • 灵活性高,可在运行时更换依赖。
  • 适用于插件式架构(如动态加载模块)。

缺点

  • 依赖可能为 nullptr,需额外检查。

3. 接口注入(Interface Injection)

通过接口定义依赖注入的契约(较少用,但某些框架支持)。

// 定义可注入 Logger 的接口
class LoggerAware {
public:virtual ~LoggerAware() = default;virtual void setLogger(Logger& logger) = 0;
};// 业务类实现接口
class OrderService : public LoggerAware {
private:Logger* logger_ = nullptr;
public:void setLogger(Logger& logger) override {logger_ = &logger;}void processOrder() {if (logger_) {logger_->log("Processing order...");}// 业务逻辑...}
};// 使用
int main() {ConsoleLogger consoleLogger;OrderService orderService;orderService.setLogger(consoleLogger);  // 通过接口注入orderService.processOrder();return 0;
}

适用场景

  • 某些 DI 框架(如 Boost.DI)可能要求接口注入。
  • 适用于标准化依赖管理的复杂系统。

4. 使用智能指针(std::shared_ptrstd::unique_ptr

适用于需要管理生命周期的依赖。

class OrderService {
private:std::shared_ptr<Logger> logger_;  // 使用智能指针
public:OrderService(std::shared_ptr<Logger> logger) : logger_(std::move(logger)) {}void processOrder() {if (logger_) {logger_->log("Processing order...");}// 业务逻辑...}
};// 使用
int main() {auto logger = std::make_shared<ConsoleLogger>();OrderService orderService(logger);  // 注入智能指针orderService.processOrder();return 0;
}

优点

  • 自动管理内存,避免内存泄漏。
  • 适用于跨线程共享依赖的情况。

5. 依赖注入容器(DI Container)

进阶用法:使用 IoC 容器自动管理依赖(如 Boost.DI)。

#include <boost/di.hpp>
namespace di = boost::di;// 定义接口和实现
class Logger { public: virtual void log(const std::string&) = 0; };
class ConsoleLogger : public Logger { public: void log(const std::string& msg) override { std::cout << msg << std::endl; } };// 业务类
class OrderService {
public:explicit OrderService(std::shared_ptr<Logger> logger) : logger_(logger) {}void processOrder() { logger_->log("Order processed!"); }
private:std::shared_ptr<Logger> logger_;
};// 使用 DI 容器
int main() {auto injector = di::make_injector(di::bind<Logger>().to<ConsoleLogger>()  // 配置依赖关系);auto orderService = injector.create<std::shared_ptr<OrderService>>();  // 自动注入orderService->processOrder();return 0;
}

适用场景

  • 大型项目,依赖关系复杂。
  • 需要自动依赖解析的情况。

总结:C++ 依赖注入的最佳实践

方法适用场景优点缺点
构造函数注入强依赖,不可变依赖明确依赖关系,编译时检查构造函数可能变复杂
Setter 注入可选依赖,运行时可变依赖灵活性高需检查 nullptr
接口注入框架要求标准化注入统一依赖管理代码稍冗余
智能指针管理需要控制生命周期的依赖避免内存泄漏可能引入不必要的共享所有权
DI 容器大型项目,自动依赖管理减少样板代码学习成本高

推荐选择

  • 大多数情况:优先使用构造函数注入(最清晰)。
  • 可选依赖:使用 Setter 注入std::optional
  • 复杂项目:考虑 DI 容器(如 Boost.DI)。
http://www.dtcms.com/wzjs/496175.html

相关文章:

  • 百度站长资源管理西安seo排名优化推广价格
  • 学校的网站建设费如何入账seo项目优化案例分析文档
  • 杭州化工网站建设如何制作一个网页网站
  • 网站页面相关产品链接怎么做外贸网站推广公司
  • 网站开发师贴吧网络营销广告策划
  • 网站 用什么数据库北京网站建设制作开发
  • 青海网站制作哪家好简述seo和sem的区别
  • 泉州市住房和乡村建设网站app推广注册从哪里接单
  • 营销型网站建设的五力原则能搜任何网站的浏览器
  • 网站团购报名怎么做网站推广策划思路的内容
  • 做网站用什么语音网站关键字优化价格
  • 滁州市建设工程协会网站公司网站建设需要多少钱
  • 怎么样让网站网址有图标济南百度推广代理商
  • 建设银行ETC的网站是哪个怎么做营销推广方案
  • 杭州网站推广方式北京互联网公司排名
  • 效果图网站模板搜索引擎营销的四种方式
  • 邯郸做网站的博客企业网站制作模板
  • 传奇手游新开网站手机营销软件
  • 北京保安公司咖啡seo是什么意思
  • 邢台信息港最新二手房出售信息西安网络优化哪家好
  • 四川建设人员数据网站广州现在有什么病毒感染
  • 连山建设局网站正规代运营公司排名
  • 上海做网站的创建属于自己的网站
  • 虚拟主机网站建设实训总结广州疫情最新数据
  • 重庆建设行政主管部门网站推广策略包括哪些内容
  • 手机投注网站建设单词优化和整站优化
  • 广告文案策划seo网络培训班
  • 神木自适应网站开发百度热议怎么上首页
  • 张家界做网站美工公司seo优化视频教程
  • wordpress 邮件函数湖南seo推广系统