IocHelpTest.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using System;
  2. using System.Text;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. namespace Vit.Ioc.MsTest
  7. {
  8. [TestClass]
  9. public class IocHelpTest
  10. {
  11. #region TestSingletonAndTransient
  12. [TestMethod]
  13. public void TestSingletonAndTransient()
  14. {
  15. //(x.1)Singleton
  16. IocHelp.AddSingleton<InterfaceA, ClassA>();
  17. IocHelp.Update();
  18. var obj0_1 = IocHelp.Create<InterfaceA>();
  19. var obj0_1_HashCode = obj0_1.GetHashCode();
  20. var obj0_2 = IocHelp.Create<InterfaceA>();
  21. var obj0_2_HashCode = obj0_2.GetHashCode();
  22. Assert.AreEqual(obj0_1_HashCode, obj0_2_HashCode);
  23. //(x.2)Transient
  24. IocHelp.AddTransient<InterfaceB, ClassA>();
  25. IocHelp.Update();
  26. var obj1_1 = IocHelp.Create<InterfaceB>();
  27. var obj1_1_HashCode = obj1_1.GetHashCode();
  28. var obj1_2 = IocHelp.Create<InterfaceB>();
  29. var obj1_2_HashCode = obj1_2.GetHashCode();
  30. Assert.AreNotEqual(obj1_1_HashCode, obj1_2_HashCode);
  31. }
  32. #endregion
  33. #region TestScope
  34. [TestMethod]
  35. public void TestScope()
  36. {
  37. //IocHelp.AddSingleton<InterfaceA, ClassA>();
  38. IocHelp.AddTransient<InterfaceB, ClassA>();
  39. //var ia1 = IocHelp.Create<InterfaceA>();
  40. IocHelp.AddScoped<InterfaceC, ClassA>();
  41. IocHelp.Update();
  42. var obj0_1 = IocHelp.Create<InterfaceC>();
  43. var obj0_1_HashCode = obj0_1.GetHashCode();
  44. var obj0_2 = IocHelp.Create<InterfaceC>();
  45. var obj0_2_HashCode = obj0_2.GetHashCode();
  46. Assert.AreEqual(obj0_1_HashCode, obj0_2_HashCode);
  47. using (var scope1 = IocHelp.CreateScope())
  48. {
  49. var obj1_1 = IocHelp.Create<InterfaceC>();
  50. var obj1_1_HashCode = obj1_1.GetHashCode();
  51. var obj1_2 = IocHelp.Create<InterfaceC>();
  52. var obj1_2_HashCode = obj1_2.GetHashCode();
  53. Assert.AreEqual(obj1_1_HashCode, obj1_2_HashCode);
  54. var objB = IocHelp.Create<InterfaceB>();
  55. var objB_HashCode = objB.GetHashCode();
  56. Assert.AreNotEqual(obj1_2_HashCode, objB_HashCode);
  57. using (var scope2 = IocHelp.CreateScope())
  58. {
  59. var obj2_1 = IocHelp.Create<InterfaceC>();
  60. var obj2_1_HashCode = obj2_1.GetHashCode();
  61. var obj2_2 = IocHelp.Create<InterfaceC>();
  62. var obj2_2_HashCode = obj2_2.GetHashCode();
  63. Assert.AreEqual(obj2_1_HashCode, obj2_2_HashCode);
  64. Assert.AreNotEqual(obj1_2_HashCode, obj2_1_HashCode);
  65. }
  66. var obj1_3 = IocHelp.Create<InterfaceC>();
  67. var obj1_3_HashCode = obj1_3.GetHashCode();
  68. Assert.AreEqual(obj1_1_HashCode, obj1_3_HashCode);
  69. }
  70. var obj0_3 = IocHelp.Create<InterfaceC>();
  71. var obj0_3_HashCode = obj0_3.GetHashCode();
  72. Assert.AreEqual(obj0_1_HashCode, obj0_3_HashCode);
  73. }
  74. #endregion
  75. #region TestAsyncLocalTask
  76. [TestMethod]
  77. public void TestAsyncLocalTask()
  78. {
  79. IocHelp.AddScoped<InterfaceC, ClassA>();
  80. IocHelp.Update();
  81. TestAsyncLocalTask_Event = new AutoResetEvent(false);
  82. builder.Clear();
  83. // 声明一个委托实例
  84. Action act = async () =>
  85. {
  86. await RunAsync();
  87. };
  88. using (var scope = IocHelp.CreateScope())
  89. {
  90. act();
  91. TestAsyncLocalTask_Event.WaitOne();
  92. }
  93. string console = builder.ToString();
  94. }
  95. static AutoResetEvent TestAsyncLocalTask_Event;
  96. static async Task RunAsync()
  97. {
  98. // 输出当前线程的ID
  99. builder.AppendLine($"异步等待前,当前线程ID:{Thread.CurrentThread.ManagedThreadId}");
  100. var obj0_1 = IocHelp.Create<InterfaceC>();
  101. var obj0_1_HashCode = obj0_1.GetHashCode();
  102. // 开始执行异步方法,并等待完成
  103. await Task.Delay(50);
  104. // 异步等待完成后,再次输出当前线程的ID
  105. builder.AppendLine($"异步等待后,当前线程ID:{Thread.CurrentThread.ManagedThreadId}");
  106. var obj0_2 = IocHelp.Create<InterfaceC>();
  107. var obj0_2_HashCode = obj0_2.GetHashCode();
  108. Assert.AreEqual(obj0_1_HashCode, obj0_2_HashCode);
  109. TestAsyncLocalTask_Event.Set();
  110. }
  111. #endregion
  112. #region class for test
  113. interface InterfaceA
  114. {
  115. void MethodA();
  116. }
  117. interface InterfaceB
  118. {
  119. void MethodB();
  120. }
  121. interface InterfaceC
  122. {
  123. void MethodC();
  124. }
  125. static StringBuilder builder = new StringBuilder();
  126. class ClassA : IDisposable, InterfaceA, InterfaceB, InterfaceC
  127. {
  128. public ClassA()
  129. {
  130. builder.Append("[ClassA.ClassA]");
  131. }
  132. public void Dispose()
  133. {
  134. builder.Append("[ClassA.Dispose]");
  135. }
  136. public void MethodA()
  137. {
  138. builder.Append("[ClassA.MethodA]");
  139. }
  140. public void MethodB()
  141. {
  142. builder.Append("[ClassA.MethodB]");
  143. }
  144. public void MethodC()
  145. {
  146. builder.Append("[ClassA.MethodC]");
  147. }
  148. }
  149. #endregion
  150. }
  151. }