SA服务框架——factory相关


结束了SA框架服务系统的初始化长系列后,我们接下来看另一个很重要的子系统功能——代理proxy

首先我们看向客户端代理的内部实现factory,理清楚factory后,在下篇文章,会重点讲解服务端和客户端对于proxy的实现

client_factory.c

0. struct Factory

首先我们看到Factory结构体:
在这里插入图片描述
里面一共三个属性:

  • SaName key:存储服务和对应feature的字符串名称
  • Creator creator:创建proxy的函数
  • Destroyer destroyer:销毁proxy的函数

通过这个结构体实现客户端代理的实例创建

1. SAMGR_CreateIClient

这个是具体的实例proxy创建函数
在这里插入图片描述

这里涉及了两个全局变量:

  • Vector g_factories:管理全局factory结构体的向量
  • MutexId g_mutex:执行互斥操作的互斥id

函数本身比较简单:
首先判断传入的service是否为NULL和是否具有g_mutex,然后调用GetFactory根据给定的service和feature获取对应的factory并调用函数creator创建真正的客户端代理

2. SAMGR_ReleaseIClient

代理的销毁函数与创建函数相对应
在这里插入图片描述
函数流程与创建函数类似,在得到对应factory后调用函数destroyer进行销毁

3. SAMGR_RegisterFactory

这个函数比较重要——必须先调用该函数进行注册,才能进行上面两个函数的操作——客户端代理的创建和销毁

/*
函数功能:当不存在g_factories时创建一个全局的g_factories;将传入的四个参数封装入factory中并添加入g_factories向量中
函数参数:service:服务名;feature:featureName;creator:客户代理的创建函数;destroyer:客户代理的销毁函数
函数返回:EC_INVALID:参数无效;EC_NOMEMORY:内存分配失败;EC_SUCCESS:成功创建
*/
int SAMGR_RegisterFactory(const char *service, const char *feature, Creator creator, Destroyer destroyer)
{
    if (service == NULL || creator == NULL || destroyer == NULL) {
        return EC_INVALID;
    }

    if (g_mutex == NULL) {
        //创建一个vector管理所有的factory
        g_factories = VECTOR_Make(NULL, (VECTOR_Compare)SAMGR_CompareSAName);
        g_mutex = MUTEX_InitValue();
        if (g_mutex == NULL) {
            return EC_NOMEMORY;
        }
    }
    //确保没有该服务对应的factory
    Factory *factory = GetFactory(service, feature);
    if (factory != NULL) {
        return EC_SUCCESS;
    }

    MUTEX_Lock(g_mutex);
    factory = SAMGR_Malloc(sizeof(Factory));
    if (factory == NULL) {
        MUTEX_Unlock(g_mutex);
        return EC_NOMEMORY;
    }
    //初始化服务和feature对应的factory
    factory->key.service = service;
    factory->key.feature = feature;
    factory->creator = creator;
    factory->destroyer = destroyer;
    int ret = VECTOR_Add(&g_factories, factory);
    MUTEX_Unlock(g_mutex);
    if (ret == INVALID_INDEX) {
        SAMGR_Free(factory);
        return EC_NOMEMORY;
    }
    return EC_SUCCESS;
}

函数流程如下:
1. 判断传入的参数是否非空
2. 当互斥锁id没有获取说明g_factories没有初始化,则调用VECTOR_Make初始化vector并调用MUTEX_InitValue对g_mutex进行赋值
3. 调用GetFactory坚持是否存在对应的factory
4. 根据传入的参数新建一个factory结构体并将其添加入g_factories完成注册

而经过注册后的factory对应的服务和feature才有了proxy创建的能力

4. GetFactory

重要的查询函数,函数的实质是通过VECTOR_FindByKey和VECTOR_At实现在vector中的查找
在这里插入图片描述

5. 总结

总的来说client_factory.c实现了对给定服务和feature创建factory并使用g_factories对所有的factory进行管理的功能,当需要为服务和feature创建代理或销毁代理时,则调用create或release函数进行创建和销毁

不妥之处,还希望和大家共同探讨!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家一级假勤奋研究牲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值