当前位置:  开发笔记 > 运维 > 正文

使用StructureMap配置配置文件

如何解决《使用StructureMap配置配置文件》经验,为你挑选了1个好方法。

重要的 ; 我真的StructureMap这里寻找答案.请不要说如何与温莎,春天,团结,或任何这样做的人.

我正在玩StructureMapIoC - 基本上我的目标是拥有一个定义核心类型的"默认"配置文件,以及一些覆盖/扩展它的命名配置文件.我认为配置文件可以做到这一点,但我无法通过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还是代码都很好......我只是想让它起作用.我只需要接口到具体类型的映射(没有特殊的配置/属性设置).



1> eglasius..:

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

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有