86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package manager
|
|
|
|
import (
|
|
"errors"
|
|
"schisandra-album-cloud-microservices/common/storage/config"
|
|
"schisandra-album-cloud-microservices/common/storage/events"
|
|
"schisandra-album-cloud-microservices/common/storage/storage"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// Factory 定义存储服务工厂函数类型
|
|
type Factory func(config *config.StorageConfig, dispatcher events.Dispatcher) (storage.Service, error)
|
|
|
|
// Manager 管理存储服务的注册、实例化和缓存
|
|
type Manager struct {
|
|
mu sync.RWMutex
|
|
registry map[string]Factory
|
|
dispatcher events.Dispatcher
|
|
cache *UserStorageCache
|
|
}
|
|
|
|
// NewStorageManager 创建新的存储管理器
|
|
func NewStorageManager(dispatcher events.Dispatcher) *Manager {
|
|
return &Manager{
|
|
registry: make(map[string]Factory),
|
|
dispatcher: dispatcher,
|
|
cache: NewUserStorageCache(),
|
|
}
|
|
}
|
|
|
|
// RegisterStorage 注册存储服务提供商
|
|
func (sm *Manager) RegisterStorage(provider string, factory Factory) error {
|
|
sm.mu.Lock()
|
|
defer sm.mu.Unlock()
|
|
|
|
if provider == "" || factory == nil {
|
|
return errors.New("invalid provider or factory")
|
|
}
|
|
if _, exists := sm.registry[provider]; exists {
|
|
return errors.New("provider already registered")
|
|
}
|
|
|
|
sm.registry[provider] = factory
|
|
return nil
|
|
}
|
|
|
|
// GetStorage 获取或创建存储服务实例
|
|
func (sm *Manager) GetStorage(key string, config *config.StorageConfig) (storage.Service, error) {
|
|
if key == "" || config.Provider == "" {
|
|
return nil, errors.New("invalid user ID or provider")
|
|
}
|
|
|
|
// 尝试从缓存获取实例
|
|
return sm.cache.GetOrCreate(key, config.Provider, func() (storage.Service, error) {
|
|
// 从注册表中查找工厂函数
|
|
sm.mu.RLock()
|
|
factory, exists := sm.registry[config.Provider]
|
|
sm.mu.RUnlock()
|
|
|
|
if !exists {
|
|
return nil, errors.New("unsupported provider: " + config.Provider)
|
|
}
|
|
|
|
// 创建新实例并返回
|
|
return factory(config, sm.dispatcher)
|
|
})
|
|
}
|
|
|
|
// ClearUnused 清理长时间未使用的缓存实例
|
|
func (sm *Manager) ClearUnused(timeout time.Duration) {
|
|
sm.cache.ClearUnused(timeout)
|
|
}
|
|
|
|
// ListProviders 列出所有注册的存储服务提供商
|
|
func (sm *Manager) ListProviders() []string {
|
|
sm.mu.RLock()
|
|
defer sm.mu.RUnlock()
|
|
|
|
providers := make([]string, 0, len(sm.registry))
|
|
for provider := range sm.registry {
|
|
providers = append(providers, provider)
|
|
}
|
|
return providers
|
|
}
|