我在StructureMap子容器中注册单例时遇到问题。
singleton有一个dependency,它在同一个容器中注册。
当试图解析singleton时,它失败了,表示无法确定依赖关系。而我可以手动解决depency没有问题。
下面的代码片段显示了这个问题:
[Test]
public void should_be_able_to_instantiate_root()
{
var parentContainer = new Container();
var childContainer = parentContainer.CreateChildContainer();
childContainer.Configure(x =>
{
x.ForSingletonOf<IRoot>().Use<Root>();
x.For<IDependency>().Use<Dependency>();
});
Console.WriteLine(childContainer.WhatDoIHave());
var dependency = childContainer.GetInstance<IDependency>(); // Works
var root = childContainer.GetInstance<IRoot>(); // Fails ("No default Instance is registered and cannot be automatically determined for type 'IDependency'")
}
public interface IRoot
{
}
public class Root : IRoot
{
public Root(IDependency dependency)
{
}
}
public interface IDependency
{
}
public class Dependency : IDependency
{
}
childContainer.GetInstance<IRoot>()
抛出以下异常:
StructureMap.StructureMapConfigurationException : No default Instance is registered and cannot be automatically determined for type 'StructureMapIssue.IDependency'
There is no configuration specified for StructureMapIssue.IDependency
1.) new Root(*Default of IDependency*)
2.) StructureMapIssue.Root
3.) Instance of StructureMapIssue.IRoot (StructureMapIssue.Root)
4.) Container.GetInstance(StructureMapIssue.IRoot)
这是childContainer.WhatDoIHave()
的输出,你可以看到IDependency
在那里:
Profile is 'DEFAULT'
========================================================================================================
PluginType Namespace Lifecycle Description Name
--------------------------------------------------------------------------------------------------------
Func<TResult> System Transient Open Generic Template for Func<> (Default)
--------------------------------------------------------------------------------------------------------
Func<T, TResult> System Transient Open Generic Template for Func<,> (Default)
--------------------------------------------------------------------------------------------------------
IContainer StructureMap Transient Object: StructureMap.Container (Default)
--------------------------------------------------------------------------------------------------------
IDependency StructureMapIssue Transient StructureMapIssue.Dependency (Default)
--------------------------------------------------------------------------------------------------------
IRoot StructureMapIssue Singleton StructureMapIssue.Root (Default)
--------------------------------------------------------------------------------------------------------
Lazy<T> System Transient Open Generic Template for Func<> (Default)
--------------------------------------------------------------------------------------------------------
Root StructureMapIssue Transient StructureMapIssue.Root (Default)
========================================================================================================
我做错什么了吗?
考虑到在子容器中实例化的东西的默认行为是实例一直保留到子容器被处理,在子容器中报单例没有多大意义。
此外,子容器并不意味着要停留很长时间——至少不会像父容器那样长。