代码之家  ›  专栏  ›  技术社区  ›  Marc Gravell

使用结构映射配置配置文件

  •  7
  • Marc Gravell  · 技术社区  · 16 年前

    重要的 我是 真的? 寻找一个 StructureMap 这里回答。请不要说如何与温莎,春天,团结,或任何 the others .

    我在玩 结构图 对于IOC——基本上,我的目标是拥有一个定义核心类型的“默认”概要文件,以及一些覆盖/扩展该类型的命名概要文件。我 认为 配置文件可以做到这一点,但我无法让它通过XML或代码API工作。尤其是,如果我尝试为配置文件加载容器:

    container = new Container();
    container.SetDefaultsToProfile(profile);
    

    然后我会得到“所请求的配置文件名称找不到”,尽管事实上我明确地称 CreateProfile 在初始化中(使用该名称)。

    我找错树了吗?

    (也张贴到 user-group )


    理想情况下,我希望能够定义 标准 (默认) 类型,然后对于一系列不同的命名配置, 覆盖一些设置-例如,如果我

    • 全球的: IFoo = & gt; Foo , IBar = & gt; Bar
    • configa:(无更改)
    • 配置: IFOO = & gt; SpecialFoo

    我相信这可以映射到2个容器,使用命名的配置文件加载。 目的是如果我要求任何一个容器 伊巴尔 我得到了 酒吧 -但configa返回 (用于 IFOO ,其中as configb返回 特洛福 .

    有人能告诉我怎么配置这个吗?无论是XML还是 代码很好…我只想让它起作用。我只需要接口- 具体类型映射(没有特殊的配置/属性设置)。

    2 回复  |  直到 13 年前
        1
  •  9
  •   Josh Kodroff    13 年前

    诀窍是确保每个单独的配置文件至少是其中定义的一个规则。如果不指定规则(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的行上失败。

        2
  •  1
  •   JeremyWeir    15 年前

    看这段视频,他展示了另一种方式来做“默认”配置文件,并有其他命名的配置文件作为变体。

    http://www.dimecasts.net/Casts/CastDetails/135