mybean.core.beanFactory.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. unit mybean.core.beanFactory;
  2. interface
  3. uses
  4. Classes, SysUtils, SyncObjs, Windows,
  5. {$IFDEF CONSOLE}
  6. {$ELSE}
  7. {$if CompilerVersion < 23}
  8. Forms,
  9. {$else}
  10. vcl.Forms,
  11. {$ifend}
  12. {$ENDIF}
  13. mybean.core.intf,
  14. mybean.core.utils,
  15. mybean.core.objects,
  16. superobject;
  17. type
  18. {$if CompilerVersion > 23}
  19. /// <summary>
  20. /// 创建插件方法<匿名方法>
  21. /// </summary>
  22. TCreatePluginMethod = reference to function():TObject;
  23. {$ELSE}
  24. /// <summary>
  25. /// 创建插件方法
  26. /// </summary>
  27. TCreatePluginMethod = function():TObject;
  28. {$ifend}
  29. TPluginInfo = class(TObject)
  30. private
  31. FInstance: IInterface;
  32. FID: string;
  33. FIsMainForm: Boolean;
  34. FPluginClass: TClass;
  35. FSingleton: Boolean;
  36. FCreateMethod: TCreatePluginMethod;
  37. procedure checkFreeInstance;
  38. public
  39. destructor Destroy; override;
  40. property ID: string read FID write FID;
  41. property IsMainForm: Boolean read FIsMainForm write FIsMainForm;
  42. property PluginClass: TClass read FPluginClass write FPluginClass;
  43. property Singleton: Boolean read FSingleton write FSingleton;
  44. end;
  45. TBeanInfo = class(TObject)
  46. private
  47. FbeanID: string;
  48. FInstance: IInterface;
  49. procedure checkFreeInstance;
  50. public
  51. destructor Destroy; override;
  52. property beanID: string read FbeanID write FbeanID;
  53. /// <summary>
  54. /// 单实例时 保存的对象
  55. /// </summary>
  56. property Instance: IInterface read FInstance write FInstance;
  57. end;
  58. TOnInitializeProc = procedure;stdcall;
  59. TPluginInfoProc = procedure(pvObject: TPluginInfo); stdcall;
  60. TOnCreateInstanceProc = function(pvObject: TPluginInfo): TObject; stdcall;
  61. TOnCreateInstanceProcEX = function(pvObject: TPluginInfo; var vBreak: Boolean): TObject; stdcall;
  62. TBeanFactory = class(TInterfacedObject,
  63. IBeanFactory,
  64. IErrorInfo)
  65. private
  66. FVclOwners:TComponent;
  67. FBeforeGetBean: TPluginInfoProc;
  68. /// <summary>
  69. /// bean的配置
  70. /// </summary>
  71. FConfig:ISuperObject;
  72. FCS: TCriticalSection;
  73. FInitializeProcInvoked:Boolean;
  74. FLastErr:String;
  75. FLastErrCode:Integer;
  76. FOnCreateInstanceProc: TOnCreateInstanceProc;
  77. FOnCreateInstanceProcEX: TOnCreateInstanceProcEX;
  78. FOnInitializeProc: TOnInitializeProc;
  79. FPlugins: TStrings;
  80. FBeanList:TStrings;
  81. function createInstance(pvObject: TPluginInfo): IInterface;
  82. procedure lock;
  83. procedure unLock;
  84. /// <summary>
  85. /// 根据beanID获取配置,如果没有返回nil值
  86. /// </summary>
  87. function findBeanConfig(pvBeanID:PAnsiChar):ISuperObject;
  88. /// <summary>
  89. /// 根据beanID获取插件ID
  90. /// </summary>
  91. function getPluginID(pvBeanID:PAnsiChar):String;
  92. /// <summary>
  93. /// 在创建的时候传入设置配置
  94. /// </summary>
  95. function checkBeanConfigSetter(const pvInterface: IInterface; const pvBeanID:
  96. PAnsiChar): Boolean;
  97. ///
  98. function checkGetBeanAccordingBeanConfig(pvBeanID: PAnsiChar; pvPluginInfo:
  99. TPluginInfo): IInterface;
  100. protected
  101. procedure resetErrorINfo;
  102. /// <summary>
  103. /// 获取错误代码,没有错误返回 0
  104. /// </summary>
  105. function getErrorCode: Integer; stdcall;
  106. /// <summary>
  107. /// 获取错误信息数据,返回读取到的错误信息长度,
  108. /// 如果传入的pvErrorDesc为nil指针,返回错误信息的长度
  109. /// </summary>
  110. function getErrorDesc(pvErrorDesc: PAnsiChar; pvLength: Integer): Integer; stdcall;
  111. protected
  112. procedure clear;
  113. function _Release: Integer; stdcall;
  114. public
  115. /// <summary>
  116. /// 注册插件
  117. /// </summary>
  118. /// <returns>
  119. ///
  120. /// </returns>
  121. /// <param name="pvPluginID"> ID </param>
  122. /// <param name="pvClass"> 类 </param>
  123. /// <param name="pvSingleton"> 是否单实例 </param>
  124. function RegisterBean(pvPluginID: String; pvClass: TClass; pvSingleton: Boolean
  125. = false): TPluginInfo; overload;
  126. /// <summary>
  127. /// 注册插件
  128. /// </summary>
  129. /// <param name="pvCreateMethod"> 创建插件的方法 </param>
  130. /// <param name="pvSingleton"> 是否单实例 </param>
  131. function RegisterBean(pvPluginID: String; pvCreateMethod: TCreatePluginMethod;
  132. pvSingleton: Boolean = false): TPluginInfo; overload;
  133. procedure RegisterMainFormBean(pvPluginID:string; pvClass: TClass);
  134. constructor Create; virtual;
  135. destructor Destroy; override;
  136. protected
  137. function getBeanMapKey(pvBeanID:PAnsiChar): String;
  138. function checkGetBeanConfig(pvBeanID:PAnsiChar): ISuperObject;
  139. /// 获取所有的插件ID
  140. function getBeanList(pvIDs:PAnsiChar; pvLength:Integer): Integer; stdcall;
  141. /// 创建一个插件
  142. function getBean(pvBeanID: PAnsiChar): IInterface; stdcall;
  143. public
  144. /// <summary>
  145. /// 初始化,加载DLL后执行
  146. /// </summary>
  147. procedure checkInitalize;stdcall;
  148. /// <summary>
  149. /// 卸载DLL之前执行
  150. /// </summary>
  151. procedure checkFinalize;stdcall;
  152. /// <summary>
  153. /// 配置所有bean的相关的配置,会覆盖之前的Bean配置
  154. /// pvConfig是Json格式
  155. /// beanID(mapKey)
  156. /// {
  157. /// id:xxxx,
  158. /// .....
  159. /// }
  160. /// </summary>
  161. function configBeans(pvConfig:PAnsiChar):Integer; stdcall;
  162. /// <summary>
  163. /// 配置bean的相关信息
  164. /// pvConfig是Json格式的参数
  165. /// 会覆盖之前的bean配置
  166. /// {
  167. /// id:xxxx,
  168. /// .....
  169. /// }
  170. /// </summary>
  171. function configBean(pvBeanID, pvConfig: PAnsiChar): Integer; stdcall;
  172. /// <summary>
  173. /// 配置bean配置
  174. /// pluginID,内部的插件ID
  175. /// </summary>
  176. function configBeanPluginID(pvBeanID, pvPluginID: PAnsiChar): Integer; stdcall;
  177. /// <summary>
  178. /// 配置bean配置
  179. /// singleton,单实例
  180. /// </summary>
  181. function configBeanSingleton(pvBeanID: PAnsiChar; pvSingleton:Boolean): Integer; stdcall;
  182. public
  183. property BeforeGetBean: TPluginInfoProc read FBeforeGetBean write
  184. FBeforeGetBean;
  185. property VclOwners: TComponent read FVclOwners;
  186. property OnInitializeProc: TOnInitializeProc read FOnInitializeProc write
  187. FOnInitializeProc;
  188. property OnCreateInstanceProc: TOnCreateInstanceProc read FOnCreateInstanceProc
  189. write FOnCreateInstanceProc;
  190. /// <summary>
  191. /// 自定义创建插件实例的函数
  192. /// </summary>
  193. property OnCreateInstanceProcEX: TOnCreateInstanceProcEX read
  194. FOnCreateInstanceProcEX write FOnCreateInstanceProcEX;
  195. end;
  196. var
  197. // 初始化 库文件
  198. OnIntializeLibFactory:TProcedure;
  199. // 反初始化 库文件
  200. OnFinalizeLibFactory:TProcedure;
  201. /// <summary>
  202. /// 导出Bean工厂实例给ApplictionContext进行管理
  203. /// </summary>
  204. function getBeanFactory: IBeanFactory; stdcall;
  205. /// <summary>
  206. /// DLL加载,传入ApplictionContext和appKeyMap服务实例
  207. /// </summary>
  208. procedure initializeBeanFactory(appContext: IApplicationContext; appKeyMap: IKeyMap); stdcall;
  209. function beanFactory: TBeanFactory;
  210. function CreateNewName(const pvRoot: TComponent; const pvBaseName: string): string;
  211. implementation
  212. uses
  213. uSOTools;
  214. var
  215. __instanceObject:TBeanFactory;
  216. __Instance:IBeanFactory;
  217. exports
  218. getBeanFactory, initializeBeanFactory;
  219. function CreateNewName(const pvRoot: TComponent; const pvBaseName: string):
  220. string;
  221. var
  222. i: integer;
  223. begin
  224. Result := pvBaseName;
  225. if (Length(Result) > 1) and (Result[1] = 'T') then Delete(Result, 1, 1);
  226. i := 1;
  227. if pvRoot <> nil then
  228. with pvRoot do
  229. while FindComponent(Result + IntToStr(i)) <> nil do
  230. inc(i);
  231. Result := Result + IntToStr(i);
  232. end;
  233. function getBeanFactory: IBeanFactory; stdcall;
  234. begin
  235. Result := __Instance;
  236. end;
  237. function beanFactory: TBeanFactory;
  238. begin
  239. Result := __instanceObject;
  240. end;
  241. procedure initializeBeanFactory(appContext: IApplicationContext; appKeyMap:
  242. IKeyMap);
  243. begin
  244. mybean.core.intf.appPluginContext := appContext;
  245. mybean.core.intf.applicationKeyMap := appKeyMap;
  246. if Assigned(OnIntializeLibFactory) then
  247. begin
  248. OnIntializeLibFactory();
  249. end;
  250. end;
  251. procedure TBeanFactory.checkFinalize;
  252. begin
  253. FVclOwners.DestroyComponents;
  254. clear;
  255. if Assigned(OnFinalizeLibFactory) then
  256. begin
  257. OnFinalizeLibFactory();
  258. end;
  259. end;
  260. function TBeanFactory.checkGetBeanAccordingBeanConfig(pvBeanID: PAnsiChar;
  261. pvPluginInfo: TPluginInfo): IInterface;
  262. var
  263. i:Integer;
  264. lvBeanINfo:TBeanInfo;
  265. lvConfig:ISuperObject;
  266. lvIsSingleton:Boolean;
  267. begin
  268. lvIsSingleton := False;
  269. lvConfig := findBeanConfig(pvBeanID);
  270. if lvConfig <> nil then
  271. begin
  272. lvIsSingleton := lvConfig.B['singleton'];
  273. end;
  274. if lvIsSingleton then
  275. begin
  276. lock();
  277. try
  278. i := FBeanList.IndexOf(string(AnsiString(pvBeanID)));
  279. if i = -1 then
  280. begin
  281. lvBeanINfo := TBeanInfo.Create;
  282. try
  283. lvBeanINfo.FbeanID := string(AnsiString(pvBeanID));
  284. lvBeanINfo.FInstance := createInstance(pvPluginInfo);
  285. checkBeanConfigSetter(lvBeanINfo.FInstance, pvBeanID);
  286. except
  287. lvBeanINfo.Free;
  288. raise;
  289. end;
  290. Result := lvBeanINfo.FInstance;
  291. FBeanList.AddObject(string(AnsiString(pvBeanID)), lvBeanINfo);
  292. end else
  293. begin
  294. lvBeanINfo := TBeanInfo(FBeanList.Objects[i]);
  295. Result := lvBeanINfo.FInstance;
  296. end;
  297. finally
  298. unLock;
  299. end;
  300. end else
  301. begin
  302. Result := createInstance(pvPluginInfo);
  303. checkBeanConfigSetter(Result, pvBeanID);
  304. end;
  305. end;
  306. function TBeanFactory.checkGetBeanConfig(pvBeanID: PAnsiChar): ISuperObject;
  307. var
  308. lvMapKey:String;
  309. begin
  310. lvMapKey := getBeanMapKey(pvBeanID);
  311. Result := FConfig.O[lvMapKey];
  312. if Result = nil then
  313. begin
  314. Result := SO();
  315. FConfig.O[lvMapKey] := Result;
  316. end;
  317. end;
  318. procedure TBeanFactory.checkInitalize;
  319. begin
  320. try
  321. if Assigned(FOnInitializeProc) and (not FInitializeProcInvoked) then
  322. begin
  323. if not FInitializeProcInvoked then
  324. begin
  325. FOnInitializeProc();
  326. FInitializeProcInvoked := true;
  327. end;
  328. end;
  329. except
  330. on E:Exception do
  331. begin
  332. __beanLogger.logMessage('执行初始化时出现了异常' + sLineBreak + e.Message);
  333. end;
  334. end;
  335. end;
  336. procedure TBeanFactory.clear;
  337. var
  338. i: Integer;
  339. begin
  340. for i := 0 to FBeanList.Count -1 do
  341. begin
  342. FBeanList.Objects[i].Free;
  343. end;
  344. FBeanList.Clear;
  345. for i := 0 to FPlugins.Count -1 do
  346. begin
  347. FPlugins.Objects[i].Free;
  348. end;
  349. FPlugins.Clear;
  350. end;
  351. function TBeanFactory.configBean(pvBeanID, pvConfig: PAnsiChar): Integer;
  352. var
  353. lvNewConfig, lvConfig:ISuperObject;
  354. begin
  355. lvNewConfig := SO(String(AnsiString(pvConfig)));
  356. if (lvNewConfig = nil) or (not lvNewConfig.IsType(stObject)) then
  357. begin
  358. Result := -1;
  359. FLastErr := 'configBean执行失败, 非法的配置' + sLineBreak + String(AnsiString(pvConfig));
  360. end else
  361. begin
  362. Result := 0;
  363. lvConfig := checkGetBeanConfig(pvBeanID);
  364. lvConfig.Merge(lvNewConfig);
  365. end;
  366. end;
  367. function TBeanFactory.configBeanPluginID(pvBeanID,
  368. pvPluginID: PAnsiChar): Integer;
  369. var
  370. lvConfig:ISuperObject;
  371. begin
  372. lvConfig := checkGetBeanConfig(pvBeanID);
  373. lvConfig.S['pluginID'] := String(AnsiString(pvPluginID));
  374. Result := 0;
  375. end;
  376. function TBeanFactory.configBeans(pvConfig: PAnsiChar): Integer;
  377. var
  378. lvConfig:ISuperObject;
  379. lvStr:string;
  380. begin
  381. resetErrorINfo;
  382. lvStr := string(AnsiString(pvConfig));
  383. lvConfig := SO(lvStr);
  384. if lvConfig = nil then
  385. begin
  386. Result := -1;
  387. FLastErr := 'configBeans执行失败, 非法的配置' + sLineBreak + lvStr;
  388. end else
  389. begin
  390. FConfig.Merge(lvConfig);
  391. Result := 0;
  392. end;
  393. end;
  394. function TBeanFactory.configBeanSingleton(pvBeanID: PAnsiChar;
  395. pvSingleton: Boolean): Integer;
  396. var
  397. lvConfig:ISuperObject;
  398. begin
  399. lvConfig := checkGetBeanConfig(pvBeanID);
  400. lvConfig.B['singleton'] := pvSingleton;
  401. Result := 0;
  402. end;
  403. constructor TBeanFactory.Create;
  404. begin
  405. inherited Create;
  406. FVclOwners := TComponent.Create(nil);
  407. FConfig := SO();
  408. FPlugins := TStringList.Create;
  409. FBeanList := TStringList.Create;
  410. FCS := TCriticalSection.Create();
  411. end;
  412. function TBeanFactory.createInstance(pvObject: TPluginInfo): IInterface;
  413. var
  414. lvResultObject:TObject;
  415. lvClass: TClass;
  416. lvBreak:Boolean;
  417. begin
  418. lvResultObject := nil;
  419. ///使用事件创建接口
  420. if Assigned(FOnCreateInstanceProcEX) then
  421. begin
  422. lvBreak := false;
  423. lvResultObject := FOnCreateInstanceProcEX(pvObject, lvBreak);
  424. if lvResultObject <> nil then
  425. try
  426. lvResultObject.GetInterface(IInterface, Result);
  427. if Result = nil then raise Exception.CreateFmt('[%s]未实现IInterface接口,不能进行创建bean', [pvObject.FPluginClass.ClassName]);
  428. Exit;
  429. except
  430. lvResultObject.Free;
  431. lvResultObject := nil;
  432. raise;
  433. end;
  434. if lvBreak then exit;
  435. end;
  436. ///使用事件2创建
  437. if Assigned(FOnCreateInstanceProc) then
  438. begin
  439. lvResultObject := FOnCreateInstanceProc(pvObject);
  440. if lvResultObject <> nil then
  441. try
  442. lvResultObject.GetInterface(IInterface, Result);
  443. if Result = nil then raise Exception.CreateFmt('[%s]未实现IInterface接口,不能进行创建bean', [pvObject.FPluginClass.ClassName]);
  444. Exit;
  445. except
  446. lvResultObject.Free;
  447. lvResultObject := nil;
  448. raise;
  449. end;
  450. end;
  451. /// 使用提供的方法进行创建
  452. if Assigned(pvObject.FCreateMethod) then
  453. begin
  454. lvResultObject := pvObject.FCreateMethod();
  455. try
  456. lvResultObject.GetInterface(IInterface, Result);
  457. if Result = nil then
  458. raise Exception.CreateFmt('[%s]提供的创建方法返回的实例, 未实现IInterface接口,不能进行创建bean', [pvObject.FID]);
  459. except
  460. lvResultObject.Free;
  461. lvResultObject := nil;
  462. raise;
  463. end;
  464. end else
  465. begin
  466. ///默认方式创建
  467. lvClass := pvObject.PluginClass;
  468. {$IFNDEF CONSOLE}
  469. if (pvObject.IsMainForm) then
  470. begin
  471. Application.CreateForm(TCustomFormClass(lvClass), lvResultObject);
  472. try
  473. lvResultObject.GetInterface(IInterface, Result);
  474. if Result = nil then raise Exception.CreateFmt('[%s]未实现IInterface接口,不能进行创建bean', [pvObject.FPluginClass.ClassName]);
  475. except
  476. lvResultObject.Free;
  477. lvResultObject := nil;
  478. raise;
  479. end;
  480. end else
  481. {$ENDIF}
  482. if lvClass.InheritsFrom(TComponent) then
  483. begin
  484. lvResultObject := TComponentClass(lvClass).Create(FVclOwners);
  485. try
  486. if TComponent(lvResultObject).Name <> '' then
  487. begin
  488. TComponent(lvResultObject).Name := CreateNewName(FVclOwners, TComponent(lvResultObject).Name);
  489. end else
  490. begin
  491. TComponent(lvResultObject).Name := CreateNewName(FVclOwners, 'BeanVcl_');
  492. end;
  493. lvResultObject.GetInterface(IInterface, Result);
  494. if Result = nil then raise Exception.CreateFmt('[%s]未实现IInterface接口,不能进行创建bean', [pvObject.FPluginClass.ClassName]);
  495. except
  496. lvResultObject.Free;
  497. lvResultObject := nil;
  498. raise;
  499. end;
  500. end else if lvClass.InheritsFrom(TMyBeanInterfacedObject) then
  501. begin
  502. lvResultObject := TMyBeanInterfacedObjectClass(lvClass).Create();
  503. try
  504. lvResultObject.GetInterface(IInterface, Result);
  505. if Result = nil then raise Exception.CreateFmt('[%s]未实现IInterface接口,不能进行创建bean', [pvObject.FPluginClass.ClassName]);
  506. except
  507. lvResultObject.Free;
  508. lvResultObject := nil;
  509. raise;
  510. end;
  511. end else
  512. begin
  513. lvResultObject := lvClass.Create;
  514. try
  515. lvResultObject.GetInterface(IInterface, Result);
  516. if Result = nil then raise Exception.CreateFmt('[%s]未实现IInterface接口,不能进行创建bean', [pvObject.FPluginClass.ClassName]);
  517. except
  518. lvResultObject.Free;
  519. lvResultObject := nil;
  520. raise;
  521. end;
  522. end;
  523. end;
  524. end;
  525. destructor TBeanFactory.Destroy;
  526. begin
  527. FVclOwners.Free;
  528. clear;
  529. FreeAndNil(FCS);
  530. FConfig := nil;
  531. FPlugins.Free;
  532. FBeanList.Free;
  533. inherited Destroy;
  534. end;
  535. function TBeanFactory.checkBeanConfigSetter(const pvInterface: IInterface;
  536. const pvBeanID: PAnsiChar): Boolean;
  537. var
  538. lvSetter:IBeanConfigSetter;
  539. lvConfig:ISuperObject;
  540. lvConfigStr:string;
  541. begin
  542. Result := false;
  543. if pvInterface = nil then exit;
  544. if pvInterface.QueryInterface(IBeanConfigSetter, lvSetter) = S_OK then
  545. begin
  546. lvConfig := findBeanConfig(pvBeanID);
  547. if lvConfig <> nil then
  548. begin
  549. lvConfigStr := lvConfig.AsJSon(True, False);
  550. lvSetter.setBeanConfig(PAnsiChar(AnsiString(lvConfigStr)));
  551. Result := true;
  552. lvConfigStr := '';
  553. end;
  554. end;
  555. end;
  556. function TBeanFactory.findBeanConfig(pvBeanID: PAnsiChar): ISuperObject;
  557. var
  558. lvMapKey:String;
  559. begin
  560. Result := nil;
  561. lvMapKey := getBeanMapKey(pvBeanID);
  562. Result := FConfig.O[lvMapKey];
  563. end;
  564. { TBeanFactory }
  565. function TBeanFactory.getBean(pvBeanID: PAnsiChar): IInterface;
  566. var
  567. i:Integer;
  568. lvPluginINfo:TPluginInfo;
  569. lvPluginID:String;
  570. begin
  571. resetErrorINfo;
  572. lvPluginID := getPluginID(pvBeanID);
  573. Result := nil;
  574. try
  575. i := FPlugins.IndexOf(lvPluginID);
  576. if i = -1 then
  577. begin
  578. FLastErrCode := -1;
  579. FLastErr := '找不到对应的插件[' + pvBeanID + ']';
  580. exit;
  581. end;
  582. lvPluginINfo :=TPluginInfo(FPlugins.Objects[i]);
  583. /// 触发事件
  584. if Assigned(FBeforeGetBean) then
  585. begin
  586. FBeforeGetBean(lvPluginINfo);
  587. end;
  588. if lvPluginINfo.Singleton then
  589. begin
  590. lock;
  591. try
  592. if lvPluginINfo.FInstance <> nil then
  593. begin
  594. Result := lvPluginINfo.FInstance;
  595. exit;
  596. end else
  597. begin
  598. Result := createInstance(lvPluginINfo);
  599. checkBeanConfigSetter(Result, pvBeanID);
  600. lvPluginINfo.FInstance := Result;
  601. end;
  602. finally
  603. unLock;
  604. end;
  605. end else
  606. begin
  607. Result := checkGetBeanAccordingBeanConfig(pvBeanID, lvPluginINfo);
  608. end;
  609. except
  610. on E:Exception do
  611. begin
  612. if FLastErrCode = 0 then FLastErrCode := -1;
  613. FLastErr := E.Message;
  614. __beanLogger.logMessage(string(FLastErr), 'DEBUG_');
  615. end;
  616. end;
  617. end;
  618. function TBeanFactory.getBeanList(pvIDs:PAnsiChar; pvLength:Integer): Integer;
  619. var
  620. lvLen:Integer;
  621. lvStr:AnsiString;
  622. begin
  623. lvStr := AnsiString(FPlugins.Text);
  624. lvLen := Length(lvStr);
  625. if lvLen > pvLength then lvLen := pvLength;
  626. CopyMemory(pvIDs, PAnsiChar(lvStr), lvLen);
  627. Result := lvLen;
  628. end;
  629. function TBeanFactory.getBeanMapKey(pvBeanID:PAnsiChar): String;
  630. begin
  631. Result := TSOTools.makeMapKey(String(AnsiString(pvBeanID)));
  632. end;
  633. function TBeanFactory.getErrorCode: Integer;
  634. begin
  635. Result := FLastErrCode;
  636. end;
  637. function TBeanFactory.getErrorDesc(pvErrorDesc: PAnsiChar;
  638. pvLength: Integer): Integer;
  639. var
  640. j:Integer;
  641. lvStr:AnsiString;
  642. begin
  643. lvStr := AnsiString(FLastErr);
  644. j := Length(lvStr);
  645. if pvErrorDesc <> nil then
  646. begin
  647. if j > pvLength then j := pvLength;
  648. CopyMemory(pvErrorDesc, PAnsiChar(lvStr), j);
  649. end;
  650. Result := j;
  651. lvStr := '';
  652. end;
  653. function TBeanFactory.getPluginID(pvBeanID: PAnsiChar): String;
  654. var
  655. lvConfig:ISuperObject;
  656. begin
  657. Result := '';
  658. lvConfig := findBeanConfig(pvBeanID);
  659. if lvConfig <> nil then
  660. begin
  661. Result := Trim(lvConfig.S['pluginID']);
  662. if Result = '' then
  663. begin
  664. Result :=Trim(lvConfig.S['id']);
  665. end;
  666. end;
  667. if Result = '' then
  668. begin
  669. Result := string(AnsiString(pvBeanID));
  670. end;
  671. end;
  672. procedure TBeanFactory.lock;
  673. begin
  674. FCS.Enter;
  675. end;
  676. function TBeanFactory.RegisterBean(pvPluginID: String; pvCreateMethod:
  677. TCreatePluginMethod; pvSingleton: Boolean = false): TPluginInfo;
  678. var
  679. lvObject:TPluginInfo;
  680. begin
  681. Result := nil;
  682. if FPlugins.IndexOf(pvPluginID) <> -1 then Exit;
  683. lvObject := TPluginInfo.Create;
  684. lvObject.FID := pvPluginID;
  685. lvObject.IsMainForm := false;
  686. lvObject.FSingleton := pvSingleton;
  687. lvObject.FCreateMethod := pvCreateMethod;
  688. lvObject.FInstance := nil;
  689. FPlugins.AddObject(pvPluginID, lvObject);
  690. Result := lvObject;
  691. end;
  692. procedure TBeanFactory.RegisterMainFormBean(pvPluginID:string; pvClass: TClass);
  693. var
  694. lvObject:TPluginInfo;
  695. begin
  696. //已经注册不再进行注册
  697. if FPlugins.IndexOf(pvPluginID) <> -1 then Exit;
  698. lvObject := TPluginInfo.Create;
  699. lvObject.FID := pvPluginID;
  700. lvObject.FPluginClass := pvClass;
  701. lvObject.FIsMainForm := true;
  702. lvObject.FInstance := nil;
  703. FPlugins.AddObject(pvPluginID, lvObject);
  704. end;
  705. procedure TBeanFactory.resetErrorINfo;
  706. begin
  707. FLastErr := '';
  708. FLastErrCode := 0;
  709. end;
  710. procedure TBeanFactory.unLock;
  711. begin
  712. FCS.Leave;
  713. end;
  714. function TBeanFactory._Release: Integer;
  715. begin
  716. Result := inherited _Release;
  717. end;
  718. function TBeanFactory.RegisterBean(pvPluginID: String; pvClass: TClass;
  719. pvSingleton: Boolean = false): TPluginInfo;
  720. var
  721. lvObject:TPluginInfo;
  722. begin
  723. Result := nil;
  724. if FPlugins.IndexOf(pvPluginID) <> -1 then Exit;
  725. lvObject := TPluginInfo.Create;
  726. lvObject.FID := pvPluginID;
  727. lvObject.FPluginClass := pvClass;
  728. lvObject.IsMainForm := false;
  729. lvObject.FSingleton := pvSingleton;
  730. lvObject.FInstance := nil;
  731. FPlugins.AddObject(pvPluginID, lvObject);
  732. Result := lvObject;
  733. end;
  734. destructor TPluginInfo.Destroy;
  735. begin
  736. try
  737. checkFreeInstance;
  738. except
  739. end;
  740. inherited Destroy;
  741. end;
  742. procedure TPluginInfo.checkFreeInstance;
  743. //var
  744. // lvFree:IFreeObject;
  745. begin
  746. // if FInstance <> nil then
  747. // begin
  748. // if FInstance.QueryInterface(IFreeObject, lvFree)=S_OK then
  749. // begin
  750. // FInstance := nil;
  751. // lvFree.FreeObject;
  752. // lvFree := nil;
  753. // end;
  754. // FInstance := nil;
  755. // end;
  756. FInstance := nil;
  757. end;
  758. procedure TBeanInfo.checkFreeInstance;
  759. //var
  760. // lvFree:IFreeObject;
  761. begin
  762. // if FInstance <> nil then
  763. // begin
  764. // if FInstance.QueryInterface(IFreeObject, lvFree)=S_OK then
  765. // begin
  766. // FInstance := nil;
  767. // lvFree.FreeObject;
  768. // lvFree := nil;
  769. // end;
  770. // end;
  771. FInstance := nil;
  772. end;
  773. destructor TBeanInfo.Destroy;
  774. begin
  775. try
  776. checkFreeInstance;
  777. except
  778. end;
  779. inherited Destroy;
  780. end;
  781. initialization
  782. __instanceObject := TBeanFactory.Create;
  783. __Instance := __instanceObject;
  784. {$IFDEF CONSOLE}
  785. // writeLn('逻辑Bean');
  786. {$ENDIF}
  787. finalization
  788. __instance.checkFinalize;
  789. __instance := nil;
  790. end.