在stucturemap中的嵌套容器中注册通用接口和实现

时间:2016-04-13 14:26:55

标签: c# generics structuremap

在从StructureMap 2.6.4升级到StructureMap 3.1.6之后,我们在嵌套容器中的通用接口的注册停止工作,我找不到它们不再工作的原因了

这是我遇到的错误

  

StructureMap.StructureMapConfigurationException:没有注册默认实例,无法自动确定类型' ITest< ExtendClass>'

以下是演示此问题的示例:

public class StructureMapContainerTests
{
    [Test]
    public void GlobalContainer()
    {
        var container = new Container();

        container.Configure(x => x.For(typeof(ITest<>)).Use(typeof(Test<>)));

        var impl = container.GetInstance<ITest<ExtendClass>>();

        Debug.WriteLine(impl.Temp()); //Works
    }

    [Test]
    public void NestedContainer()
    {
        var container = new Container();
        var nestedContainer = container.GetNestedContainer();

        nestedContainer.Configure(x => x.For(typeof(ITest<>)).Use(typeof(Test<>)));

        var impl = nestedContainer.GetInstance<ITest<ExtendClass>>();

        Debug.WriteLine(impl.Temp()); //Doesn't work
    }
}

public interface ITest<T> where T : BaseClass
{
    string Temp();
}

public class Test<T> : ITest<T> where T : ExtendClass
{
    public string Temp()
    {
        return "OK: " + typeof(T);
    }
}

public class BaseClass { }

public class ExtendClass : BaseClass { }

上述两个测试都在StructureMap 2.6.4中有效,但在3.1.6中,使用嵌套容器的第二个测试不再起作用。

有人知道这是一个已删除的功能还是我只是错误地使用它,在这种情况下可以帮助我一些? :)

1 个答案:

答案 0 :(得分:0)

根据我的经验,您可以在StructureMap的嵌套容器中注册泛型类型和装饰器。

我们解决这个问题的方法是将注册表分成两个注册表,一个包含注册到父容器中的泛型和装饰器,另一个包含注册到嵌套容器中的非泛型接口。不幸的是,在构建可扩展系统时,这并不容易。

Jeremy在Google Groups对其他任何感兴趣的人做出了对Tobias的回应。

  

嵌套容器架构是3.0的完全重写。老实说,我认为2.6。*的事实只是一个快乐的事故。

     

目前,不支持嵌套容器上的那种注册......

     

Jeremy D. Miller