Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.55 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace StaticDependencyRegistration
  5. {
  6. public static class Program
  7. {
  8. public static void Main()
  9. {
  10. var rand = Register.PerCaller(() => new Random(Guid.NewGuid().GetHashCode()));
  11.  
  12. var intBasedRegistrations =
  13. rand.AndPerCaller(_ => _.Get<Random>().Next())
  14. .AndPerCaller(_ => new List<int> { _.Get<int>() })
  15. .AndPerCaller(_ => _.Get<List<int>>().ToArray());
  16.  
  17. var doubleBasedRegistrations =
  18. rand.AndPerCaller(_ => _.Get<Random>().NextDouble())
  19. .AndSingle(_ => new List<double> { _.Get<double>() })
  20. .AndSingle(_ => _.Get<List<double>>().ToArray());
  21.  
  22. var registrations = intBasedRegistrations.Combine(doubleBasedRegistrations);
  23.  
  24. // ints create a new array each time:
  25. Console.WriteLine(string.Join(", ", registrations.Get<int[]>()));
  26. Console.WriteLine(string.Join(", ", registrations.Get<int[]>()));
  27.  
  28. // doubles create only one array (used "Single" registration):
  29. Console.WriteLine(string.Join(", ", registrations.Get<double[]>()));
  30. Console.WriteLine(string.Join(", ", registrations.Get<double[]>()));
  31. }
  32. }
  33.  
  34. public static class Register
  35. {
  36. public static InstanceRegistration<T> Instance<T>(T it) => new InstanceRegistration<T>(it);
  37.  
  38. public static Registration<T> PerCaller<T>(Func<T> f) => new Registration<T>(f);
  39.  
  40. public static Registration<T> SingleInstance<T>(Func<T> f)
  41. {
  42. var lazy = new Lazy<T>(f);
  43. return new Registration<T>(() => lazy.Value);
  44. }
  45. }
  46.  
  47. public static class Extensions
  48. {
  49. public static InstanceRegistration<TLeft, TRight> AndInstance<TLeft, TRight>(this TLeft left, TRight right)
  50. => new InstanceRegistration<TLeft, TRight>(left, right);
  51.  
  52. public static Registration<TLeft, TRight> AndSingle<TLeft, TRight>(this TLeft left, Func<TLeft, TRight> right)
  53. {
  54. var lazy = new Lazy<TRight>(() => right(left));
  55. return new Registration<TLeft, TRight>(left, () => lazy.Value);
  56. }
  57.  
  58. public static Registration<TLeft, TRight> AndPerCaller<TLeft, TRight>(this TLeft left, Func<TLeft, TRight> right)
  59. => new Registration<TLeft, TRight>(left, () => right(left));
  60.  
  61. public static InstanceRegistration<TLeft, TRight> Combine<TLeft, TRight>(this TLeft left, TRight right) => left.AndInstance(right);
  62.  
  63. public static T Get<T>(this IGet<T> it) => it.Get;
  64. public static T Get<T>(this IGet<IGet<T>> it) => it.Get.Get();
  65. public static T Get<T>(this IGet<IGet<IGet<T>>> it) => it.Get.Get();
  66. public static T Get<T>(this IGet<IGet<IGet<IGet<T>>>> it) => it.Get.Get();
  67. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<T>>>>> it) => it.Get.Get();
  68. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>> it) => it.Get.Get();
  69. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>> it) => it.Get.Get();
  70. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>> it) => it.Get.Get();
  71. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>> it) => it.Get.Get();
  72. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>> it) => it.Get.Get();
  73. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>>> it) => it.Get.Get();
  74. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>>>> it) => it.Get.Get();
  75. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>>>>> it) => it.Get.Get();
  76. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>>>>>> it) => it.Get.Get();
  77. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>>>>>>> it) => it.Get.Get();
  78. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>>>>>>>> it) => it.Get.Get();
  79. public static T Get<T>(this IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<IGet<T>>>>>>>>>>>>>>>>> it) => it.Get.Get();
  80. }
  81.  
  82. public interface IGet<out T>
  83. {
  84. T Get { get; }
  85. }
  86.  
  87. public class Registration<T> : IGet<T>
  88. {
  89. private readonly Func<T> _factory;
  90.  
  91. public Registration(Func<T> factory)
  92. {
  93. _factory = factory;
  94. }
  95.  
  96. T IGet<T>.Get => _factory();
  97. }
  98.  
  99. public class InstanceRegistration<T> : IGet<T>
  100. {
  101. private readonly T _instance;
  102.  
  103. public InstanceRegistration(T instance)
  104. {
  105. _instance = instance;
  106. }
  107.  
  108. T IGet<T>.Get => _instance;
  109. }
  110.  
  111. public class InstanceRegistration<TLeft, TRight> : InstanceRegistration<TLeft>, IGet<TRight>
  112. {
  113. private readonly TRight _right;
  114.  
  115. public InstanceRegistration(TLeft left, TRight right) : base(left)
  116. {
  117. _right = right;
  118. }
  119.  
  120. TRight IGet<TRight>.Get => _right;
  121. }
  122.  
  123. public class Registration<TLeft, TRight> : InstanceRegistration<TLeft>, IGet<TRight>
  124. {
  125. private readonly Func<TRight> _right;
  126.  
  127. public Registration(TLeft left, Func<TRight> right) : base(left)
  128. {
  129. _right = right;
  130. }
  131.  
  132. TRight IGet<TRight>.Get => _right();
  133. }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement