2009-09-15 27 views
0

我正在使用结构图并根据传递的配置文件字符串设置服务。我有一个对象列表。列表IProcessors,我需要注入到RecognizerSaga来处理每个这些处理器。选择配置文件结构图中的所有项目

说,启动代码看起来是这样的:

x.CreateProfile("A1", p => { 
     p.Type<IProcessor>().Is.OfConcreteType<TestAProcessor>(); 
     p.Type<IProcessor>().Is.OfConcreteType<TestBProcessor>(); 
     p.Type<IProcessor>().Is.OfConcreteType<TestCProcessor>(); 
    } 

x.CreateProfile("B2", p => { 
     p.Type<IProcessor>().Is.OfConcreteType<TestAProcessor>(); 
     p.Type<IProcessor>().Is.OfConcreteType<TestBProcessor>(); 
    }); 

当我拿到这些处理器我尝试使用ObjectFactory.GetAllInstances<IProductProcessor>它来建立并返回我他们所有5虽然我已经设置了默认的配置文件为A1。有没有办法获取配置文件中的所有实例?如果我说A1,只给我3个?

为了解决这个问题,我建立了一个为我构建对象的工厂类,但我更喜欢一直使用结构映射。

+0

很可能需要添加的语言标签你使用,让更多的人可能看问题。 – sth 2009-09-16 02:04:49

+0

谢谢..已添加c# – bkhanal 2009-09-16 16:13:26

回答

0

不幸的是,这在StructureMap中是不可能的。

配置文件的想法是指定插件类型的默认具体类型。每次为同一界面配置配置文件默认类型时,都会重新定义默认的具体类型。

另一种做你正在寻找的方法是配置一个类型数组来传递一个具体类型,它本身被设置为配置文件的默认类型。

下面是测试证明它工作的例子:

public interface IProcessor { } 
public class ProcessorA : IProcessor { } 
public class ProcessorB : IProcessor { } 
public class ProcessorC : IProcessor { } 

public class ProcessorGroup 
{ 
    public IProcessor[] Processors { get; private set; } 

    public ProcessorGroup(IProcessor[] processors) 
    { 
     Processors = processors; 
    } 
} 

public class ProcessorRegistry : Registry 
{ 
    public ProcessorRegistry() 
    { 
     CreateProfile("a", profile => 
     { 
      profile.For<ProcessorGroup>().UseNamedInstance("a"); 
     }); 

     CreateProfile("b", profile => 
     { 
      profile.For<ProcessorGroup>().UseNamedInstance("b"); 
     }); 

     ForConcreteType<ProcessorGroup>() 
      .Configure.WithName("a") 
      .TheArrayOf<IProcessor>().Contains(a => 
      { 
       a.OfConcreteType<ProcessorA>(); 
      }); 

     ForConcreteType<ProcessorGroup>() 
      .Configure.WithName("b") 
      .TheArrayOf<IProcessor>().Contains(a => 
      { 
       a.OfConcreteType<ProcessorB>(); 
       a.OfConcreteType<ProcessorC>(); 
      }); 
    } 
} 

[TestFixture] 
public class test 
{ 
    [Test] 
    public void processor_group_a() 
    { 
     var container = new Container(new ProcessorRegistry()); 

     container.SetDefaultsToProfile("a"); 
     var processorGroup = container.GetInstance<ProcessorGroup>(); 

     processorGroup.Processors.Length.ShouldEqual(1); 
    } 

    [Test] 
    public void processor_group_b() 
    { 
     var container = new Container(new ProcessorRegistry()); 

     container.SetDefaultsToProfile("b"); 
     var processorGroup = container.GetInstance<ProcessorGroup>(); 

     processorGroup.Processors.Length.ShouldEqual(2); 
    } 
}