3

У меня возникли трудности с условным созданием зависимости. Googling, мне еще предстоит найти хороший пример использования BuildStack и условных предикатов.StructureMap HowTo: Условное построение на глубоком объекте

Вот что я делаю в реестре:

//snip 

public SomeRegistry() 
{ 
    this.InstanceOf<IFoo>().Is.Conditional(
     c => 
      { 
       c.TheDefault.Is.ConstructedBy(() => new FooZ()); 

       c.If(
        p => p.ParentType.IsAssignableFrom(typeof(IBar)) && 
          p.BuildStack.Current.RequestedType.IsAssignableFrom(typeof(IDoStuffWithFooA))) 
          .ThenIt.Is.ConstructedBy(() => new FooA()); 
       c.If(
        p => p.ParentType.IsAssignableFrom(typeof(IBar)) && 
          p.BuildStack.Current.RequestedType.IsAssignableFrom(typeof(IDoStuffWithFooB))) 
          .ThenIt.Is.ConstructedBy(() => new FooB()); 
      }); 

    this.Scan(
     s => 
      { 
       s.TheCallingAssembly(); 
       s.WithDefaultConventions(); 
      }); 
} 

//snip 

Вот юнит-тесты, показывая, что я ожидал

//snip 

[TestFixture] 
public class ConditionalCreationTest 
{ 
    [Test] 
    public void GiveUsFooAWhenDoingStuffWithA() 
    { 
     var dependA = ObjectFactory.GetInstance<IDoStuffWithFooA>(); 

     Assert.IsInstanceOfType<FooA>(dependA.Foo); 
    } 

    [Test] 
    public void GiveUsFooBWhenDoingStuffWithB() 
    { 
     var dependB = ObjectFactory.GetInstance<IDoStuffWithFooB>(); 

     Assert.IsInstanceOfType<FooB>(dependB.Foo); 
    } 

    [Test] 
    public void GiveUsFooZByDefault() 
    { 
     var foo = ObjectFactory.GetInstance<IFoo>(); 

     Assert.IsInstanceOfType<FooZ>(foo); 
    } 

    [Test] 
    public void GiveUsProperFoosWhenWeDontAskDirectly() 
    { 
     var bar = ObjectFactory.GetInstance<IBar>(); 

     Assert.IsInstanceOfType<FooA>(bar.DoStuffA.Foo); 
     Assert.IsInstanceOfType<FooB>(bar.DoStuffB.Foo); 
    } 

    [SetUp] 
    public void SetUp() 
    { 
     ObjectFactory.Initialize(a => a.AddRegistry<SomeRegistry>()); 
    } 
} 
//snip 

Это то, что я хочу StructureMap к AutoWire с правильной зависимостью IFoo:

//snip 
    public class Bar : IBar 
    { 
     private IDoStuffWithFooA doStuffA; 
     private IDoStuffWithFooB doStuffB; 

     public Bar(IDoStuffWithFooA doStuffA, IDoStuffWithFooB doStuffB) 
     { 
      this.doStuffA = doStuffA; 
      this.doStuffB = doStuffB; 
     } 

     public IDoStuffWithFooA DoStuffA 
     { 
      get 
      { 
       return this.doStuffA; 
      } 
     } 

     public IDoStuffWithFooB DoStuffB 
     { 
      get 
      { 
       return this.doStuffB; 
      } 
     } 
    } 
//snip 

Я не могу понять, как получить GiveUsProperFoosWhenWeDontAskDirectly TES t пройти.

Я хочу получить FooA получить инициализируется, когда мне нужно IDoStuffWithFooA, FooB когда IDoStuffWithFooB, независимо от того, когда это необходимо в графике. Каков правильный синтаксис условного предиката?

ответ

1

Часто бывает лучше избегать условной конструкции с этим синтаксисом, это гораздо труднее интерпретировать, чем для использования. Ваш сценарий можно решить, используя:

 For<IDoStuffWithFooA>().Use<DoStuffWithFooA>().Ctor<IFoo>().Is<FooA>(); 
     For<IDoStuffWithFooB>().Use<DoStuffWithFooB>().Ctor<IFoo>().Is<FooB>(); 

     For<IFoo>().Use<FooZ>(); 

     Scan(
      s => 
      { 
       s.TheCallingAssembly(); 
       s.WithDefaultConventions(); 
      });