重要的 ; 我真的在StructureMap
这里寻找答案.请不要说如何与温莎,春天,团结,或任何这样做的人.
我正在玩StructureMap
IoC - 基本上我的目标是拥有一个定义核心类型的"默认"配置文件,以及一些覆盖/扩展它的命名配置文件.我认为配置文件可以做到这一点,但我无法通过xml或代码API使其工作.特别是,如果我尝试为配置文件加载容器:
container = new Container(); container.SetDefaultsToProfile(profile);
然后我得到"请求的个人资料{name}无法找到",尽管事实上我已经明确地调用CreateProfile
了初始化(使用该名称).
我吠叫错了树吗?
(也发布到用户组)
我理想的是能够定义标准(/默认)类型,然后对于一系列不同的命名配置,覆盖一些设置 - 即如果我有
global:IFoo
=> Foo
,IBar
=>Bar
configA :(没有变化)
configB:IFoo
=>SpecialFoo
我相信这可以映射到2个容器,使用命名的配置文件加载.目的是,如果我要求任何一个容器IBar
,我得到一个
Bar
- 但是configA返回一个Foo
(for IFoo
),其中 - 如同configB返回一个
SpecialFoo
.
有人能告诉我如何配置这个吗?无论是xml还是代码都很好......我只是想让它起作用.我只需要接口到具体类型的映射(没有特殊的配置/属性设置).
诀窍是确保每个配置文件至少是其中定义的规则.如果您未指定规则(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().TheDefault.Is.OfConcreteType (); ForRequestedType ().TheDefault.Is.OfConcreteType (); CreateProfileNotEmpty("configA"); CreateProfileNotEmpty("configB") .For ().UseConcreteType (); } StructureMap.Configuration.DSL.Expressions.ProfileExpression CreateProfileNotEmpty(string profile) { return CreateProfile(profile) .For ().UseConcreteType (); } }
它将适用于这些测试:
[TestMethod] public void TestMethod1() { var container = new Container(new MyRegistry()); Assert.IsNotNull(container.GetInstance()); Assert.AreEqual("Hello", container.GetInstance ().SayHello()); container.SetDefaultsToProfile("configB"); Assert.IsNotNull(container.GetInstance ()); Assert.AreEqual("Hello Special", container.GetInstance ().SayHello()); container.SetDefaultsToProfile("configA"); Assert.IsNotNull(container.GetInstance ()); Assert.AreEqual("Hello", container.GetInstance ().SayHello()); }
如果用简单的CreateProfile替换CreateProfileNotEmpty,它将在将默认值设置为configA的行上失败.