如何在子容器中注册单例?

时间:2015-02-26 13:29:55

标签: structuremap

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

我做错了吗?

1 个答案:

答案 0 :(得分:0)

在子容器中注册单例是没有多大意义的,考虑到在子容器中实例化的东西的默认行为是实例在子容器被丢弃之前一直存在。

此外,儿童容器并不意味着长时间坚持 - 至少不会像父母一样长。