我在StructureMap子容器中注册单例时遇到问题。
单身人士具有在同一容器中登记的依赖性。
当尝试解析单例时,它无法说它无法确定依赖项。而我可以手动解决依赖问题。
以下代码段显示了问题:
[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)
========================================================================================================
我做错了吗?
答案 0 :(得分:0)
在子容器中注册单例是没有多大意义的,考虑到在子容器中实例化的东西的默认行为是实例在子容器被丢弃之前一直存在。
此外,儿童容器并不意味着长时间坚持 - 至少不会像父母一样长。