在从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中,使用嵌套容器的第二个测试不再起作用。
有人知道这是一个已删除的功能还是我只是错误地使用它,在这种情况下可以帮助我一些? :)
答案 0 :(得分:0)
根据我的经验,您可以在StructureMap的嵌套容器中注册泛型类型和装饰器。
我们解决这个问题的方法是将注册表分成两个注册表,一个包含注册到父容器中的泛型和装饰器,另一个包含注册到嵌套容器中的非泛型接口。不幸的是,在构建可扩展系统时,这并不容易。
Jeremy在Google Groups对其他任何感兴趣的人做出了对Tobias的回应。
嵌套容器架构是3.0的完全重写。老实说,我认为2.6。*的事实只是一个快乐的事故。
目前,不支持嵌套容器上的那种注册......
Jeremy D. Miller