c++服务容器
C++ 服务容器通常指的是一种设计模式或框架,用于管理和组织服务的创建和生命周期。在 C++ 中实现服务容器时,通常会涉及以下几个关键概念:
- 依赖注入:服务容器可以自动处理依赖关系的解析和注入。这可以通过构造函数注入、属性注入或方法注入来实现。
- 服务注册和解析:你需要一个机制来注册服务(或类实例)并在需要时解析这些服务。通常这涉及到一个中央容器类,负责存储和管理所有服务的实例。
- 生命周期管理:服务的生命周期(例如单例、瞬态或请求作用域)通常由容器管理。
- 反射:一些高级容器可能使用反射来动态地创建和管理服务。
以下是一个简单的 C++ 服务容器的示例:
#include <iostream>
#include <memory>
#include <unordered_map>
#include <string>
// Interface
class IService
{
public:
virtual void execute() = 0;
virtual ~IService() = default;
};
class MyService : public IService
{
public:
void execute() override
{
std::cout << "Executing MyService" << std::endl;
}
};
// 上面两个只是一种服务,下面的容器可以存放很多种类服务,因为不是和具体辅路类绑定,所以才叫做容器
// 因为不和具体类绑定,所以需要模板
// 服务容器,专门盛放服务的容器
// 容器接口:注册服务,取消服务,需要使用模板
class ServiceContainer
{
public:
void registerService(const std::string& key, std::unique_ptr<IService> service)
{
services[key] = std::move(service);
}
IService* resolve(const std::string& key)
{
return services[key].get();
}
private:
// 因为IService是抽象类,所以不存在实体,只能使用指针
// 为什么在c++里面,在头文件里面可以定义一个抽象类的指针。头文件里面定义的都会在对象创建的时候初始化,抽象类本身不能初始化,但是抽象类指针的本质就只是一个指针,指针是现实存在的,只是在后续使用这个指针对象的解析不同。include头文件之后,头文件包含到源文件里面,会执行默认初始化,指针也会被创建。
// 创建抽象类的指针可行的原因是:因为动态解析的原因。抽象类指针可以指向继承类的对象
// 下面是指针类存储
// std::unique_ptr<IService>:抽象类指针
std::unordered_map<std::string, std::unique_ptr<IService>> services;
};
int main()
{
// 定义一个服务对象
ServiceContainer container;
// 创建一个服务并注册
container.registerService("MyService", std::make_unique<MyService>());
IService* service = container.resolve("MyService");
if (service)
{
service->execute();
}
return 0;
}
在这个例子中,ServiceContainer 类可以注册和解析服务。你可以扩展这个基本的框架以添加更多功能,例如生命周期管理和更复杂的依赖关系解析。
// 因为IService是抽象类,所以不存在实体,只能使用指针
// 为什么在c++里面,在头文件里面可以定义一个抽象类的指针。头文件里面定义的都会在对象创建的时候初始化,抽象类本身不能初始 化,但是抽象类指针的本质就只是一个指针,指针是现实存在的,只是在后续使用这个指针对象的解析不同。include头文件之后,头 文件包含到源文件里面,会执行默认初始化,指针也会被创建。
// 创建抽象类的指针可行的原因是:因为动态解析的原因。抽象类指针可以指向继承类的对象
// 下面是指针类存储
// std::unique_ptr:抽象类指针
服务容器的一般样式
- 定义一个服务接口类型,具体类型从这个类型继承
- 容器:容器,容器存储的是服务对象,容器是在服务创建之间建立的,具体的服务类型是未知的,所以,只能使用模板类创建容器。容器类:接口:注册服务,取消注册服务,使用模板函数。存储服务,存储的是指针,是抽象类指针

4632

被折叠的 条评论
为什么被折叠?



