TestSubContainers4.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System.Collections.Generic;
  2. using NUnit.Framework;
  3. using Assert = ModestTree.Assert;
  4. namespace Zenject.Tests.Other
  5. {
  6. [TestFixture]
  7. public class TestSubContainers4 : ZenjectUnitTestFixture
  8. {
  9. readonly Dictionary<object, DiContainer> _subContainers = new Dictionary<object, DiContainer>();
  10. [Test]
  11. public void RunTest()
  12. {
  13. SetupContainer();
  14. var view1 = Container.Resolve<RotorView>();
  15. Assert.IsEqual(view1.Controller.Model, view1.Model);
  16. var view2 = Container.Resolve<RotorView>();
  17. Assert.IsEqual(view2.Controller.Model, view2.Model);
  18. Assert.IsNotEqual(view2.Model, view1.Model);
  19. Assert.IsNotEqual(view2, view1);
  20. }
  21. void SetupContainer()
  22. {
  23. Container.Bind<RotorController>().FromMethod(SubContainerResolve<RotorController>).AsTransient()
  24. .WhenInjectedInto<RotorView>();
  25. Container.Bind<RotorModel>().FromMethod(SubContainerResolve<RotorModel>).AsTransient()
  26. .WhenInjectedInto<RotorView>();
  27. Container.Bind<RotorView>().AsTransient();
  28. }
  29. T SubContainerResolve<T>(InjectContext context)
  30. {
  31. Assert.IsNotNull(context.ObjectInstance);
  32. DiContainer subContainer;
  33. if (!_subContainers.TryGetValue(context.ObjectInstance, out subContainer))
  34. {
  35. subContainer = context.Container.CreateSubContainer();
  36. _subContainers.Add(context.ObjectInstance, subContainer);
  37. InstallViewBindings(subContainer);
  38. }
  39. return (T)subContainer.Resolve(context);
  40. }
  41. void InstallViewBindings(DiContainer subContainer)
  42. {
  43. subContainer.Bind<RotorController>().AsSingle();
  44. subContainer.Bind<RotorModel>().AsSingle();
  45. }
  46. public class RotorController
  47. {
  48. [Inject]
  49. public RotorModel Model;
  50. }
  51. public class RotorView
  52. {
  53. [Inject]
  54. public RotorController Controller;
  55. [Inject]
  56. public RotorModel Model;
  57. }
  58. public class RotorModel
  59. {
  60. }
  61. }
  62. }