本来想使用ts的装饰器来制作类似c#中Attribute扫描自动注册Module的方式,但是发现似乎无法做到,于是就转其他方案了,然后脑子突然冒出一个服务定位于是开始实现它,它实际和单例相差不是很大.区别就是单例是类型且只有1个,服务定位是通过一个ServiceLocation<T>中间者来管理实例,实例就根据ServiceLocation<T>的实现可以有多个或1个.

不过在我项目中Module是不允许多个,所以我叫它为ModuleManager来感觉还比较亲和

下面是测试代码, 在线测试


class ModuleManager
{
    private static readonly _moduleMap:{[key:string]:IcModule} = {};

    public static GetModule<T extends typeof IcModule>(type: T) : InstanceType<T>
    {
        if (!this._moduleMap[type.name])
            this._moduleMap[type.name] = new type();

        return this._moduleMap[type.name] as any;
    }
}

class IcModule
{
    public static Ins<T extends typeof IcModule>(this: T) : InstanceType<T>
    {
        return ModuleManager.GetModule(this);
    }
}

class TestCC extends IcModule
{
    Name:string;
    constructor()
    {
        super();
        this.Name = Date.now().toString();
    }
}

class TestCC2 extends IcModule
{
    get Age():number
    {
        return Math.random() * 100;
    }

    constructor()
    {
        super();
    }
}


var test = ModuleManager.GetModule(TestCC);

console.clear();

console.log(test.Name);

console.log(TestCC2.Ins().Age);