诀窍是确保每个单独的配置文件至少是其中定义的一个规则。如果不指定规则(configa),它将不会创建/查看配置文件。
考虑到这些类别:
public interface IFoo { string SayHello(); }
public class Foo : IFoo { public string SayHello() { return "Hello"; } }
public class SpecialFoo : IFoo { public string SayHello() { return "Hello Special"; } }
public interface IBar { }
public class Bar : IBar { }
public interface IDummy { }
public class Dummy : IDummy{ }
您可以定义此注册表:
public class MyRegistry : Registry
{
protected override void configure()
{
ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar>();
ForRequestedType<IFoo>().TheDefault.Is.OfConcreteType<Foo>();
CreateProfileNotEmpty("configA");
CreateProfileNotEmpty("configB")
.For<IFoo>().UseConcreteType<SpecialFoo>();
}
StructureMap.Configuration.DSL.Expressions.ProfileExpression CreateProfileNotEmpty(string profile)
{
return CreateProfile(profile)
.For<IDummy>().UseConcreteType<Dummy>();
}
}
它将与这些测试一起工作:
[TestMethod]
public void TestMethod1()
{
var container = new Container(new MyRegistry());
Assert.IsNotNull(container.GetInstance<IBar>());
Assert.AreEqual("Hello", container.GetInstance<IFoo>().SayHello());
container.SetDefaultsToProfile("configB");
Assert.IsNotNull(container.GetInstance<IBar>());
Assert.AreEqual("Hello Special", container.GetInstance<IFoo>().SayHello());
container.SetDefaultsToProfile("configA");
Assert.IsNotNull(container.GetInstance<IBar>());
Assert.AreEqual("Hello", container.GetInstance<IFoo>().SayHello());
}
如果用简单的createprofile替换createprofilenotempty,它将在将默认值设置为configa的行上失败。