DryIoc容器中的分辨率状态

时间:2017-12-14 12:22:59

标签: dryioc

是否有可能在DryIoc容器中找出是否已经实例化了一些单例?

例如

var container = new Container();
container.Register<IApplicationContext, ApplicationContext>( Reuse.Singleton );

// var context = container.Resolve<IApplicationContext>(); 

if ( container.IsInstantiated<IApplicationContext>() ) // Apparently this does not compile
{
  // ...
}
// OR
if ( container.IsInstantiated<ApplicationContext>() )
{
  // ...
}

1 个答案:

答案 0 :(得分:1)

目前没有办法,也没有计划这样的功能。您可以create an issue提出要求。

但我在徘徊为什么需要它。原因单身人士只提供一次保证,因此您可能不会担心或检查双重创建。

是否有别的东西?

更新

好的,在DryIoc中你可以注册一个“装饰者”来控制和提供关于decoratee创建的信息,here is more on decorators

[TestFixture]
public class SO_IsInstantiatedViaDecorator
{
    [Test]
    public void Test()
    {
        var c = new Container();
        c.Register<IService, X>(Reuse.Singleton);

        c.Register<XProvider>(Reuse.Singleton);

        c.Register<IService>(
            Made.Of(_ => ServiceInfo.Of<XProvider>(), p => p.Create(Arg.Of<Func<IService>>())),
            Reuse.Singleton,
            Setup.Decorator);

        c.Register<A>();

        var x = c.Resolve<XProvider>();
        Assert.IsFalse(x.IsCreated);

        c.Resolve<A>();

        Assert.IsTrue(x.IsCreated);
    }

    public interface IService { }
    public class X : IService { }

    public class A
    {
        public A(IService service) { }
    }

    public class XProvider
    {
        public bool IsCreated { get; private set; }
        public IService Create(Func<IService> factory)
        {
            IsCreated = true;
            return factory();
        }
    }
}

此示例还说明了DryIoc装饰器和factory methods的组合有多强大。