Main.pas 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. unit Main;
  2. interface
  3. uses
  4. System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  5. FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox,
  6. FMX.Memo,
  7. Quick.IOC,
  8. Dependencies;
  9. type
  10. TForm1 = class(TForm)
  11. meInfo: TMemo;
  12. Panel1: TPanel;
  13. btnCheckIOC: TButton;
  14. procedure FormCreate(Sender: TObject);
  15. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  16. procedure btnCheckIOCClick(Sender: TObject);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22. var
  23. Form1: TForm1;
  24. iocContainer : TIocContainer;
  25. sumservice : ISumService;
  26. multservice : IMultService;
  27. bigservice : IBigService;
  28. divideservice : TDivideService;
  29. executions : Integer = 0;
  30. implementation
  31. {$R *.fmx}
  32. procedure TForm1.btnCheckIOCClick(Sender: TObject);
  33. var
  34. res : Integer;
  35. i : Integer;
  36. times : Integer;
  37. numoperations : Integer;
  38. begin
  39. times := 100;
  40. res := 0;
  41. Inc(executions);
  42. //test1: class injection as singleton
  43. for i := 1 to times do
  44. begin
  45. sumservice := iocContainer.Resolve<ISumService>;
  46. res := sumservice.Sum(2,2);
  47. end;
  48. if sumservice.NumOperations = times * executions + (times * (executions - 1)) then meInfo.Lines.Add('Test1: Class injection as Singleton test ok')
  49. else meInfo.Lines.Add('Test1: Class injection as Singleton test error');
  50. meInfo.Lines.Add(Format('SumService.Sum = %d (calls: %d)',[res,sumservice.NumOperations]));
  51. //test2: class injection as transient
  52. for i := 1 to times do
  53. begin
  54. multservice := iocContainer.Resolve<IMultService>;
  55. res := multservice.Mult(2,4);
  56. end;
  57. if multservice.NumOperations = 1 then meInfo.Lines.Add('Test2: Class injection as Transient test ok')
  58. else meInfo.Lines.Add('Test2: Class injection as Transient test error');
  59. meInfo.Lines.Add(Format('MultService.Mult = %d (calls: %d)',[res,multservice.NumOperations]));
  60. //test3: constructor injection as singleton
  61. for i := 1 to times do
  62. begin
  63. bigservice := iocContainer.Resolve<IBigService>('one');
  64. res := bigservice.Sum(2,2);
  65. end;
  66. if bigservice.NumOperations = times * executions then meInfo.Lines.Add('Test3: Constructor injection as Singleton test ok')
  67. else meInfo.Lines.Add('Test3: Constructor injection as Singleton test error');
  68. meInfo.Lines.Add(Format('BigService.Sum = %d (calls: %d to BigService / calls: %d to SumService (as singleton))',[res,bigservice.NumOperations,bigservice.sumservice.NumOperations]));
  69. //test4: constructor injection as transient
  70. for i := 1 to times do
  71. begin
  72. bigservice := iocContainer.Resolve<IBigService>('other');
  73. res := bigservice.Mult(2,4);
  74. end;
  75. if bigservice.NumOperations = 1 then meInfo.Lines.Add('Test4: Constructor injection as Transient test ok')
  76. else meInfo.Lines.Add('Test4: Constructor injection as Transient test error');
  77. meInfo.Lines.Add(Format('BigService.Mult = %d (calls: %d to BigService / calls: %d to MultService (as transient))',[res,bigservice.NumOperations,bigservice.multservice.NumOperations]));
  78. //test5: class instance injection as singleton
  79. for i := 1 to times do
  80. begin
  81. divideservice := iocContainer.Resolve<TDivideService>('one');
  82. res := divideservice.Divide(100,2);
  83. end;
  84. if divideservice.NumOperations = times * executions then meInfo.Lines.Add('Test5: Class instance injection as Singleton test ok')
  85. else meInfo.Lines.Add('Test5: Class instance injection as Singleton test error');
  86. meInfo.Lines.Add(Format('DivideService.Divide = %d (calls: %d)',[res,divideservice.NumOperations]));
  87. //test6: class instance injection as transient
  88. for i := 1 to times do
  89. begin
  90. divideservice := iocContainer.Resolve<TDivideService>('other');
  91. res := divideservice.Divide(100,2);
  92. numoperations := divideservice.NumOperations;
  93. //transient instances must be manual free
  94. divideservice.Free;
  95. end;
  96. if numoperations = 1 then meInfo.Lines.Add('Test6: Class instance injection as Transient test ok')
  97. else meInfo.Lines.Add('Test6: Class instance injection as Transient test error');
  98. meInfo.Lines.Add(Format('DivideService.Divide = %d (calls: %d)',[res,numoperations]));
  99. meInfo.Lines.Add('Test finished');
  100. end;
  101. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  102. begin
  103. iocContainer.Free;
  104. end;
  105. procedure TForm1.FormCreate(Sender: TObject);
  106. begin
  107. iocContainer := TIocContainer.Create;
  108. iocContainer.RegisterType<ISumService,TSumService>.AsSingleTon.DelegateTo(function : TSumService
  109. begin
  110. Result := TSumService.Create;
  111. end);
  112. iocContainer.RegisterType<IMultService,TMultService>.AsTransient;
  113. iocContainer.RegisterType<IBigService,TBigService>('one').AsSingleTon;
  114. iocContainer.RegisterType<IBigService,TBigService>('other').AsTransient;
  115. iocContainer.RegisterInstance<TDivideService>('one').AsSingleton.DelegateTo(function : TDivideService
  116. begin
  117. Result := TDivideService.Create(True);
  118. end);
  119. iocContainer.RegisterInstance<TDivideService>('other').AsTransient.DelegateTo(function : TDivideService
  120. begin
  121. Result := TDivideService.Create(True);
  122. end);
  123. end;
  124. end.