DryIoc 容器中的解析状态

Resolution status in DryIoc container

是否有可能在 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>() )
{
  // ...
}

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

但我在想为什么需要它。因为单例提供了只创建一次的保证,所以你可以不用担心或检查重复创建。

是为了别的吗?

更新

好的,在DryIoc中你可以注册一个"decorator"来控制和提供关于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 的组合有多强大。