145 lines
2.9 KiB
C++
145 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <extra2d/core/types.h>
|
|
#include <string>
|
|
|
|
namespace extra2d {
|
|
|
|
/**
|
|
* @brief 服务优先级枚举
|
|
* 定义服务的初始化顺序,数值越小越先初始化
|
|
*/
|
|
enum class ServicePriority : i32 {
|
|
Core = 0,
|
|
Event = 100,
|
|
Timer = 200,
|
|
Scene = 300,
|
|
Camera = 400,
|
|
Resource = 500,
|
|
Audio = 600,
|
|
User = 1000
|
|
};
|
|
|
|
/**
|
|
* @brief 服务状态枚举
|
|
*/
|
|
enum class ServiceState {
|
|
Uninitialized,
|
|
Initializing,
|
|
Running,
|
|
Paused,
|
|
Stopping,
|
|
Stopped
|
|
};
|
|
|
|
/**
|
|
* @brief 服务信息结构体
|
|
*/
|
|
struct ServiceInfo {
|
|
std::string name;
|
|
ServicePriority priority = ServicePriority::User;
|
|
ServiceState state = ServiceState::Uninitialized;
|
|
bool enabled = true;
|
|
};
|
|
|
|
/**
|
|
* @brief 服务接口基类
|
|
* 所有服务必须实现此接口,支持依赖注入和生命周期管理
|
|
*/
|
|
class IService {
|
|
friend class ServiceLocator;
|
|
|
|
public:
|
|
virtual ~IService() = default;
|
|
|
|
/**
|
|
* @brief 获取服务信息
|
|
* @return 服务信息结构体
|
|
*/
|
|
virtual ServiceInfo info() const = 0;
|
|
|
|
/**
|
|
* @brief 初始化服务
|
|
* @return 初始化成功返回 true
|
|
*/
|
|
virtual bool init() = 0;
|
|
|
|
/**
|
|
* @brief 关闭服务
|
|
*/
|
|
virtual void shutdown() = 0;
|
|
|
|
/**
|
|
* @brief 暂停服务
|
|
*/
|
|
virtual void pause() {
|
|
info_.state = ServiceState::Paused;
|
|
}
|
|
|
|
/**
|
|
* @brief 恢复服务
|
|
*/
|
|
virtual void resume() {
|
|
if (info_.state == ServiceState::Paused) {
|
|
info_.state = ServiceState::Running;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief 更新服务
|
|
* @param dt 帧间隔时间
|
|
*/
|
|
virtual void update(f32 dt) { }
|
|
|
|
/**
|
|
* @brief 检查服务是否已初始化
|
|
* @return 已初始化返回 true
|
|
*/
|
|
virtual bool initialized() const {
|
|
return info_.state == ServiceState::Running ||
|
|
info_.state == ServiceState::Paused;
|
|
}
|
|
|
|
/**
|
|
* @brief 获取服务状态
|
|
* @return 当前服务状态
|
|
*/
|
|
ServiceState state() const { return info_.state; }
|
|
|
|
/**
|
|
* @brief 获取服务名称
|
|
* @return 服务名称
|
|
*/
|
|
const std::string& name() const { return info_.name; }
|
|
|
|
protected:
|
|
ServiceInfo info_;
|
|
|
|
/**
|
|
* @brief 设置服务状态
|
|
* @param state 新状态
|
|
*/
|
|
void setState(ServiceState state) { info_.state = state; }
|
|
};
|
|
|
|
/**
|
|
* @brief 类型ID生成器
|
|
* 用于为每种服务类型生成唯一ID
|
|
*/
|
|
using ServiceTypeId = size_t;
|
|
|
|
namespace detail {
|
|
inline ServiceTypeId nextServiceTypeId() {
|
|
static ServiceTypeId id = 0;
|
|
return ++id;
|
|
}
|
|
|
|
template<typename T>
|
|
ServiceTypeId getServiceTypeId() {
|
|
static ServiceTypeId id = nextServiceTypeId();
|
|
return id;
|
|
}
|
|
}
|
|
|
|
}
|