Castle类型可选(属性)依赖性问题,与Typed Factory工具相关

时间:2011-04-30 15:32:14

标签: castle-windsor factory

我正面临以下问题

鉴于此伪代码,

  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永远不为null;现在这里是棘手的事情,如果我将依赖设置为[DoNotWire],它在任何情况下都不会解决它(显然),对于这两种工厂方法,我有点需要windsor只从工厂的命名args解决它设施在解决管道中注入而不是从类型解析中注入。有没有办法配置或扩展windsor来做到这一点。我在这里错过了一些观点吗?我可以解决它做一个工厂包装器来设置值并将其设置为[DoNotWire],但我在几个工厂中遇到这个问题,似乎应该是一种让它以更合适的方式工作的方法

提前致谢

0 个答案:

没有答案