ACE_Service_Repository 클래스는 서비스 객체의 컨테이너입니다. ACE_Service_Repository_Iterator 클래스로 내부 서비스 객체를 추적할 수 있습니다.
ACE_Service_Repository 클래스는 ACE_Service_Type* 데이터를 배열 형식으로 보관합니다.
ACE_Service_Repository 클래스는 또 다시 Bridge 패턴으로 ACE_Service_Type_Impl 클래스가 실제적인 기능을 구현하고 있습니다. ACE_Service_Type_Impl 클래스 내부에 void* obj_ 변수는 실제적으로 우리가 만든 서비스 객체에 대한 포인터를 보관합니다.
서비스 유형의 ACE_Service_Object_Type, ACE_Module_Type, ACE_Stream_Type 형태의 서비스로 구분됩니다.
ServiceLoader.cpp 파일
// ServiceLoader.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <ace/ACE.h>
#include <ace/Service_Config.h>
#include <ace/Reactor.h>
#include <ace/Service_Manager.h>
#include <ace/Naming_Context.h>
#include <ace/Service_Repository.h>
#include <ace/Service_Types.h>
#include <iostream>
//ACE_FACTORY_DEFINE( ACE_Local_Service, ACE_Service_Manager);
ACE_STATIC_SVC_DEFINE( Service_Manager,
"MyService",
ACE_SVC_OBJ_T,
& ACE_SVC_NAME(ACE_Service_Manager),
ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
0);
ACE_STATIC_SVC_REQUIRE( Service_Manager );
#include <ace/Logging_Strategy.h>
ACE_STATIC_SVC_REQUIRE(ACE_Logging_Strategy);
void svcprint();
int main(int argc, char* argv[])
{
ACE::init();
ACE_STATIC_SVC_REGISTER( Service_Manager );
ACE_Service_Config::open( argc, argv,ACE_DEFAULT_LOGGER_KEY,false ); //svc.conf
svcprint();
ACE_Reactor::instance() ->run_reactor_event_loop();
ACE::fini();
return 0;
}
void svcprint(){
ACE_Service_Repository_Iterator iter(*ACE_Service_Repository::instance(),false);
const ACE_Service_Type* item(NULL);
const ACE_Service_Type_Impl* obj(NULL);
for( ; 0 != iter.next(item); iter.advance() ){
std::cout<< std::endl<< "---------------------------";
std::cout<< std::endl<< "ACE_Service_Type name:"<<item->name();
std::cout<< std::endl<< "ACE_Service_Type active:"<< (item->active()?"active":"paused");
obj = item->type();
std::cout<< std::endl<< "ACE_Service_Type_Impl name:"<<obj->name();
std::cout<< std::endl<< "ACE_Service_Type_Impl service_type:";
switch( obj->service_type()){
case ACE_Service_Type::SERVICE_OBJECT:
std::cout<<"SERVICE_OBJECT";
break;
case ACE_Service_Type::STREAM:
std::cout<<"STREAM";
break;
case ACE_Service_Type::MODULE:
std::cout<<"MODULE";
break;
case ACE_Service_Type::INVALID_TYPE:
std::cout<<"INVALID_TYPE";
break;
}
}
}