我正在使用结构图并根据传递的配置文件字符串设置服务。我有一个对象列表。我需要注入IProcessors
的{{1}}列表,以处理每个处理器。
说,bootstrapping代码看起来像这样:
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>();
});
构建它,虽然我已将默认配置文件设置为A1,但它会返回我所有5个处理器。有没有办法在配置文件中获取所有实例。如果我说,A1,只给我3个?
为了解决这个问题,我构建了一个为我构建对象的工厂类,但我更喜欢结构图。
答案 0 :(得分: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);
}
}