2010-07-06 67 views
0

我不知道爲什麼以下不起作用。 StructureMap告訴我沒有爲SomeClassWithDependencies定義的默認依賴關係... um ...依賴關係。任何人都可以對此有所瞭解嗎?我想通過基於命名實例的整個依賴樹來構造對象。我吠叫錯了樹嗎?StructureMap和命名實例

public class Program 
{ 
    static void Main(string[] args) 
    { 
     ObjectFactory.Initialize(x=>x.AddRegistry(new MyRegistry())); 


     ISomeClassWithDependencies someClassWithDependencies = ObjectFactory.GetNamedInstance<ISomeClassWithDependencies>("name1"); 
    } 
} 
public interface ISomeClassWithDependencies 
{ 
} 

public class SomeClassWithDependencies : ISomeClassWithDependencies 
{ 
    public IEnumerable<IValidator> Validators { get; private set; } 

    public SomeClassWithDependencies(IEnumerable<IValidator> type1s) 
    { 
     Validators = type1s; 
    } 
} 

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     ForRequestedType<ISomeClassWithDependencies>().AddInstances(
      x => x.Is.OfConcreteType<SomeClassWithDependencies>().WithName("name1")); 
     ForRequestedType<IEnumerable<IValidator>>().AddInstances(x=>x.ConstructedBy(BuildValidators).WithName("name1")); 
     ForRequestedType<IEnumerable<IValidator>>().AddInstances(x => x.ConstructedBy(BuildValidators2).WithName("name2")); 
    } 

    public IEnumerable<IValidator> BuildValidators() 
    { 
     var validatorOne = ObjectFactory.GetInstance<Validator1>(); 
     var validatorTwo = ObjectFactory.GetInstance<Validator2>(); 

     return new List<IValidator> { validatorOne, validatorTwo }; 
    } 

    public IEnumerable<IValidator> BuildValidators2() 
    { 
     var validatorOne = ObjectFactory.GetInstance<Validator1>(); 

     return new List<IValidator> { validatorOne }; 
    } 
} 

回答

1

首先,你有一個名爲兩種不同的情況下,以「名1」,其次IEnumerables,數組和IList/List<T> S被StructureMap經過特殊處理,並呼籲例如Ctor<IEnumerable<T>>()被忽略。

你可以使用(只)這個在您的註冊表(2.6.1語法):

For<ISomeClassWithDependencies>().Use<SomeClassWithDependencies>() 
      .EnumerableOf<IValidator>("type1s").Contains(
      x => 
       { 
        x.Type<Validator1>(); 
        x.Type<Validator2>(); 
       } 
      ); 

,並使用該實例

var someClassWithDependencies = 
      ObjectFactory.GetInstance<ISomeClassWithDependencies>();