fscan/app/container.go
ZacharyZcR b463984e78 refactor: 重构main.go入口文件并引入依赖注入架构
- 创建app包实现依赖注入容器和初始化器模式
- 重构main.go为六阶段清晰的初始化流程
- 新增结构化错误处理替代简陋的os.Exit调用
- 为HostInfo添加辅助函数增强功能但保持向后兼容
- 引入TargetInfo包装器支持上下文和元数据管理
- 优化代码组织提升可维护性和可测试性
2025-08-12 14:37:28 +08:00

107 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"context"
"fmt"
"sync"
"github.com/shadow1ng/fscan/common"
"github.com/shadow1ng/fscan/core"
)
// Container 依赖注入容器
type Container struct {
services map[string]interface{}
initializers []Initializer
mu sync.RWMutex
initialized bool
}
// NewContainer 创建新的容器
func NewContainer() *Container {
container := &Container{
services: make(map[string]interface{}),
}
// 注册默认初始化器
container.AddInitializer(&PluginInitializer{})
return container
}
// AddInitializer 添加初始化器
func (c *Container) AddInitializer(init Initializer) {
c.initializers = append(c.initializers, init)
}
// Register 注册服务
func (c *Container) Register(name string, service interface{}) {
c.mu.Lock()
defer c.mu.Unlock()
c.services[name] = service
}
// Get 获取服务
func (c *Container) Get(name string) (interface{}, bool) {
c.mu.RLock()
defer c.mu.RUnlock()
service, exists := c.services[name]
return service, exists
}
// Initialize 初始化容器和所有服务
func (c *Container) Initialize() error {
if c.initialized {
return nil
}
// 执行所有初始化器
for _, initializer := range c.initializers {
if err := initializer.Initialize(); err != nil {
return WrapError(ErrInitFailed, err)
}
}
c.initialized = true
return nil
}
// RunScan 执行扫描包装现有的core.RunScan
func (c *Container) RunScan(ctx context.Context, info common.HostInfo) error {
// 使用新的验证函数
if err := common.ValidateHostInfo(&info); err != nil {
return WrapError(ErrScanFailed, err)
}
// 创建目标信息(展示新功能,但保持兼容)
target := common.NewTargetInfo(info)
target.WithContext(ctx)
target.SetMetadata("container_managed", true)
target.SetMetadata("validation_passed", true)
// 记录扫描信息
c.logScanInfo(target)
// 调用现有的扫描逻辑
core.RunScan(info)
return nil
}
// logScanInfo 记录扫描信息
func (c *Container) logScanInfo(target *common.TargetInfo) {
targetStr := target.String()
if targetStr != "" {
common.LogDebug(fmt.Sprintf("容器管理的扫描目标: %s", targetStr))
}
if target.HasMetadata("validation_passed") {
common.LogDebug("目标验证通过")
}
}
// Cleanup 清理资源
func (c *Container) Cleanup() {
// 清理输出资源
common.CloseOutput()
}