如何在子容器中注册单例

  • 本文关键字:注册 单例 structuremap
  • 更新时间 :
  • 英文 :


我在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)
========================================================================================================

我做错什么了吗?

考虑到在子容器中实例化的东西的默认行为是实例一直保留到子容器被处理,在子容器中报单例没有多大意义。

此外,子容器并不意味着要停留很长时间——至少不会像父容器那样长。

最新更新