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中,使用嵌套容器的第二个测试不再起作用.
有人知道这是一个已被删除的功能还是我只是错误使用它,在这种情况下可以帮助我一些?:)
根据我的经验,您既不能在 StructureMap 的嵌套容器中注册泛型类型,也不能注册装饰器。
我们解决这个问题的方法是将注册表分成 2 个注册表,一个包含注册到父容器中的泛型和装饰器,另一个包含注册到嵌套容器中的非泛型接口。不幸的是,在构建可扩展系统时,这并不总是那么容易做到。
以下是杰里米 (Jeremy) 在Google 网上论坛对托比亚斯 (Tobias) 的回复,供其他感兴趣的人参考。
嵌套容器架构是对 3.0 的完全重写。老实说,我认为它在 2.6.* 上运行只是一个令人高兴的意外。
目前,不支持在嵌套容器上进行这种类型的注册......
杰里米·D·米勒
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |