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

Tob*_*erg 5 c# structuremap generics

在从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 { }
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*ndt 0

根据我的经验,您既不能在 StructureMap 的嵌套容器中注册泛型类型,也不能注册装饰器。

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

以下是杰里米 (Jeremy) 在Google 网上论坛对托比亚斯 (Tobias) 的回复,供其他感兴趣的人参考。

嵌套容器架构是对 3.0 的完全重写。老实说,我认为它在 2.6.* 上运行只是一个令人高兴的意外。

目前,不支持在嵌套容器上进行这种类型的注册......

杰里米·D·米勒