Необязательная (свойство) проблема с замком в реализации с помощью Typed Factory - PullRequest
0 голосов
/ 30 апреля 2011

Я столкнулся со следующей проблемой

Учитывая этот псевдокод,

  public interface IA
  {
     ...
  }

  public interface IB
  {
      IA someOptionalDependency;

  }

  public interface IRepositoryA
  {
     ...
     IA GetDefault();
     IA Get(object Id);
  }

  public interface IFactoryB
  {
       IB Create();
       IB Create(IA a);
  }


  public class B : IB
  {
      public B(IRepositoryA repoA)
      {
         _repoA=repoA;

      }

      public IA someOptionalDependency {
         get{ 
            if (_someOptionalDependency==null)  
               _someOptionalDependency=_repoA.GetDefault();
            return _someOptionalDependency;
         }
         set{
            if (_someOptionalDependency!=null)
               throw(new Exception("This is read only");  
            _someOptionalDependency=value;
         }
     }

      private IA _someOptionalDependency;
      private IRepositoryA _repoA;
  }

  [TestFixture]
  public class Test
  {
        [Test]
        public void FactoryMethodsShouldWork()
        {
            var factoryB=container.Resolve<IFactoryB>();
            var repoA=container.Resolve<IRepositoryA>();
            var someA=repoA.Get(someID);


            var B1=factoryB.Create();
            var B2=factoryB.Create(someA);

            Assert.AreEqual(repoA.GetDefault(),B1.someOptionalDependency);
            Assert.AreEqual(someA,B1.someOptionalDependency);


        }

  }

Я использую средство Typed Factory для фабрики и регистрирую все в контейнере.Тест не проходит, потому что контейнер всегда разрешает необязательную зависимость A и помещает в нее новый объект, поэтому someOptionalDependency никогда не будет нулевым;Теперь вот хитрость: если я установлю зависимость на [DoNotWire], она не разрешит ее (очевидно) ни в коем случае, для обоих заводских методов мне нужно, чтобы windsor разрешил ее только из именованных аргументов, которые фабрикаобъект внедряется в разрешающий конвейер, а не из типизированного разрешающего.Есть ли способ настроить или расширить виндзор, чтобы сделать это.Я что-то упускаю здесь?Я могу обойти это, создав обертку Factory, чтобы установить значение и установить его в [DoNotWire], но у меня есть эта проблема на нескольких фабриках, и, похоже, это должен быть способ заставить ее работать более корректно

Заранее спасибо

...