2010-07-06 84 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>();