2

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

1 回答 1

1

目前没有办法,也没有计划这样的功能。你可以创建一个问题来请求这个。

但我在徘徊为什么需要它。因为单例提供了只创建一次的保证,因此您不必担心或检查是否有双重创建。

是为了别的吗?

更新

好的,在 DryIoc 中你可以注册一个“装饰器”来控制和提供关于装饰器创建的信息,这里有更多关于装饰器的信息:

[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 装饰器和工厂方法的组合有多么强大。

于 2017-12-15T08:15:10.350 回答