StructureMap IOC命名实例帮助

3

我在使用StructureMap IOC时遇到了问题。我希望能够根据标签或名称检索实现相同接口的不同具体对象。

internal static class InstanceHelper
{

    internal enum Taxonomy
    {
        Foo,
        Bar
    }

    static InstanceHelper()
    {
            // Initialize the container
            ObjectFactory.Initialize(x =>
            {
                x.For<IMyInterface>().Use<ObjectA>().Named(Taxonomy.Foo.ToString());
                x.For<IMyInterface>().Use<ObjectB>().Named(Taxonomy.Bar.ToString());
            });

    }

    internal static IMyInterface GetInstanceByTaxonomy(Taxonomy taxonomy)
    {

          // this raises an exception
          ObjectFactory.GetNamedInstance<IMyInterface>(taxonomy.ToString());

    }
}

就这方面来说,文档不是很好,似乎所有的示例都已被弃用... 我正在使用版本2.6.1.0。

谢谢。


2
将你的 Use() 调用更改为 Add()。 - Joshua Flanagan
2个回答

1

使用AddInstances方法添加你的命名实例

ObjectFactory.Initialize(x =>
{
    x.For<IMyInterface>().AddInstances(i =>
    {
        i.Type<ObjectA>().Named("Foo");
        i.Type<ObjectB>().Named("Bar");
    });
});

这对我来说是有效的,但我同意文档在不同版本之间有时会误导人,第一次使用时我花了一段时间才弄清楚。


0

原始方法和amarsuperstar的方法似乎都可以正常工作,问题在于类'ObjectA'的范围被声明为internal,并带有一个内部构造函数。我将其更改为Public,现在IOC可以看到它了...反射逆转发生在StructureMap程序集中。唉,我真是太傻了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接