LockedResolver.swift 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. import Foundation
  2. import Swinject
  3. /// This class adds a simple wrapper around a Swinject resolver to ensure that only one thread can
  4. /// access it at any given time.
  5. struct LockedResolver: Resolver {
  6. let resolver: Resolver
  7. let lock: NSRecursiveLock
  8. func resolve<Service, Arg1>(_ serviceType: Service.Type, argument: Arg1) -> Service? {
  9. lock.lock()
  10. let service = resolver.resolve(serviceType, argument: argument)
  11. lock.unlock()
  12. return service
  13. }
  14. func resolve<Service, Arg1>(_ serviceType: Service.Type, name: String?, argument: Arg1) -> Service? {
  15. lock.lock()
  16. let service = resolver.resolve(serviceType, name: name, argument: argument)
  17. lock.unlock()
  18. return service
  19. }
  20. func resolve<Service, Arg1, Arg2>(_ serviceType: Service.Type, arguments arg1: Arg1, _ arg2: Arg2) -> Service? {
  21. lock.lock()
  22. let service = resolver.resolve(serviceType, arguments: arg1, arg2)
  23. lock.unlock()
  24. return service
  25. }
  26. func resolve<Service, Arg1, Arg2>(
  27. _ serviceType: Service.Type,
  28. name: String?,
  29. arguments arg1: Arg1,
  30. _ arg2: Arg2
  31. ) -> Service? {
  32. lock.lock()
  33. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2)
  34. lock.unlock()
  35. return service
  36. }
  37. func resolve<Service, Arg1, Arg2, Arg3>(
  38. _ serviceType: Service.Type,
  39. arguments arg1: Arg1,
  40. _ arg2: Arg2,
  41. _ arg3: Arg3
  42. ) -> Service? {
  43. lock.lock()
  44. let service = resolver.resolve(serviceType, arguments: arg1, arg2, arg3)
  45. lock.unlock()
  46. return service
  47. }
  48. func resolve<Service, Arg1, Arg2, Arg3>(
  49. _ serviceType: Service.Type,
  50. name: String?,
  51. arguments arg1: Arg1,
  52. _ arg2: Arg2,
  53. _ arg3: Arg3
  54. ) -> Service? {
  55. lock.lock()
  56. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2, arg3)
  57. lock.unlock()
  58. return service
  59. }
  60. func resolve<Service, Arg1, Arg2, Arg3, Arg4>(
  61. _ serviceType: Service.Type,
  62. arguments arg1: Arg1,
  63. _ arg2: Arg2,
  64. _ arg3: Arg3,
  65. _ arg4: Arg4
  66. ) -> Service? {
  67. lock.lock()
  68. let service = resolver.resolve(serviceType, arguments: arg1, arg2, arg3, arg4)
  69. lock.unlock()
  70. return service
  71. }
  72. func resolve<Service, Arg1, Arg2, Arg3, Arg4>(
  73. _ serviceType: Service.Type,
  74. name: String?,
  75. arguments arg1: Arg1,
  76. _ arg2: Arg2,
  77. _ arg3: Arg3,
  78. _ arg4: Arg4
  79. ) -> Service? {
  80. lock.lock()
  81. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4)
  82. lock.unlock()
  83. return service
  84. }
  85. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5>(
  86. _ serviceType: Service.Type,
  87. arguments arg1: Arg1,
  88. _ arg2: Arg2,
  89. _ arg3: Arg3,
  90. _ arg4: Arg4,
  91. _ arg5: Arg5
  92. ) -> Service? {
  93. lock.lock()
  94. let service = resolver.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5)
  95. lock.unlock()
  96. return service
  97. }
  98. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5>(
  99. _ serviceType: Service.Type,
  100. name: String?,
  101. arguments arg1: Arg1,
  102. _ arg2: Arg2,
  103. _ arg3: Arg3,
  104. _ arg4: Arg4,
  105. _ arg5: Arg5
  106. ) -> Service? {
  107. lock.lock()
  108. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5)
  109. lock.unlock()
  110. return service
  111. }
  112. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6>(
  113. _ serviceType: Service.Type,
  114. arguments arg1: Arg1,
  115. _ arg2: Arg2,
  116. _ arg3: Arg3,
  117. _ arg4: Arg4,
  118. _ arg5: Arg5,
  119. _ arg6: Arg6
  120. ) -> Service? {
  121. lock.lock()
  122. let service = resolver.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6)
  123. lock.unlock()
  124. return service
  125. }
  126. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6>(
  127. _ serviceType: Service.Type,
  128. name: String?,
  129. arguments arg1: Arg1,
  130. _ arg2: Arg2,
  131. _ arg3: Arg3,
  132. _ arg4: Arg4,
  133. _ arg5: Arg5,
  134. _ arg6: Arg6
  135. ) -> Service? {
  136. lock.lock()
  137. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6)
  138. lock.unlock()
  139. return service
  140. }
  141. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7>(
  142. _ serviceType: Service.Type,
  143. arguments arg1: Arg1,
  144. _ arg2: Arg2,
  145. _ arg3: Arg3,
  146. _ arg4: Arg4,
  147. _ arg5: Arg5,
  148. _ arg6: Arg6,
  149. _ arg7: Arg7
  150. ) -> Service? {
  151. lock.lock()
  152. let service = resolver.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7)
  153. lock.unlock()
  154. return service
  155. }
  156. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7>(
  157. _ serviceType: Service.Type,
  158. name: String?,
  159. arguments arg1: Arg1,
  160. _ arg2: Arg2,
  161. _ arg3: Arg3,
  162. _ arg4: Arg4,
  163. _ arg5: Arg5,
  164. _ arg6: Arg6,
  165. _ arg7: Arg7
  166. ) -> Service? {
  167. lock.lock()
  168. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7)
  169. lock.unlock()
  170. return service
  171. }
  172. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8>(
  173. _ serviceType: Service.Type,
  174. arguments arg1: Arg1,
  175. _ arg2: Arg2,
  176. _ arg3: Arg3,
  177. _ arg4: Arg4,
  178. _ arg5: Arg5,
  179. _ arg6: Arg6,
  180. _ arg7: Arg7,
  181. _ arg8: Arg8
  182. ) -> Service? {
  183. lock.lock()
  184. let service = resolver.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
  185. lock.unlock()
  186. return service
  187. }
  188. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8>(
  189. _ serviceType: Service.Type,
  190. name: String?,
  191. arguments arg1: Arg1,
  192. _ arg2: Arg2,
  193. _ arg3: Arg3,
  194. _ arg4: Arg4,
  195. _ arg5: Arg5,
  196. _ arg6: Arg6,
  197. _ arg7: Arg7,
  198. _ arg8: Arg8
  199. ) -> Service? {
  200. lock.lock()
  201. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
  202. lock.unlock()
  203. return service
  204. }
  205. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9>(
  206. _ serviceType: Service.Type,
  207. arguments arg1: Arg1,
  208. _ arg2: Arg2,
  209. _ arg3: Arg3,
  210. _ arg4: Arg4,
  211. _ arg5: Arg5,
  212. _ arg6: Arg6,
  213. _ arg7: Arg7,
  214. _ arg8: Arg8,
  215. _ arg9: Arg9
  216. ) -> Service? {
  217. lock.lock()
  218. let service = resolver.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
  219. lock.unlock()
  220. return service
  221. }
  222. func resolve<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9>(
  223. _ serviceType: Service.Type,
  224. name: String?,
  225. arguments arg1: Arg1,
  226. _ arg2: Arg2,
  227. _ arg3: Arg3,
  228. _ arg4: Arg4,
  229. _ arg5: Arg5,
  230. _ arg6: Arg6,
  231. _ arg7: Arg7,
  232. _ arg8: Arg8,
  233. _ arg9: Arg9
  234. ) -> Service? {
  235. lock.lock()
  236. let service = resolver.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
  237. lock.unlock()
  238. return service
  239. }
  240. func resolve<Service>(_ serviceType: Service.Type) -> Service? {
  241. lock.lock()
  242. let service = resolver.resolve(serviceType)
  243. lock.unlock()
  244. return service
  245. }
  246. func resolve<Service>(_ serviceType: Service.Type, name: String?) -> Service? {
  247. lock.lock()
  248. let service = resolver.resolve(serviceType, name: name)
  249. lock.unlock()
  250. return service
  251. }
  252. }