从UnityContainer中检索实例化的类型

问题描述 投票:0回答:1

(使用Unity 4.0.1)

给定一个UnityContainer对象,有没有办法检索容器实例化到目前为止的所有对象?例如。就像是

IEnumerable<object> instantiatedObjects = unityContainer.GetAllInstantiatedObjects();

或者更好的是,根据从给定类型派生的那些进行过滤:

IEnumerable<IFoo> instantiatedFoos = unityContainer.GetAllInstantiatedObjects<IFoo>();

c# unity-container
1个回答
0
投票

RB's suggestion之后,以下方法使用策略在postInitializtion上保持对每个实例化对象的引用的implements a custom Unity extension

注:以下代码仅用于说明目的,并非旨在用于线程安全/异常安全等。

首先,实现Extension类和它依赖的其他类。

public class ObjectContainer
{
    private readonly List<object> _instantiatedObjects = new List<object>();
    public void Add(object instantiatedObject)
    {
        _instantiatedObjects.Add(instantiatedObject);
    }
    public IEnumerable<object> GetInstantiatedObjects()
    {
        return _instantiatedObjects;
    }
    public IEnumerable<T> GetInstantiatedObjects<T>()
    {
        return GetInstantiatedObjects().OfType<T>();
    }
}

public class InstantiatedObjectsStrategy : BuilderStrategy
{
    private readonly ObjectContainer _objectContainer;
    public InstantiatedObjectsStrategy(ObjectContainer objectContainer)
    {
        _objectContainer = objectContainer;
    }
    public override void PostBuildUp(IBuilderContext context)
    {
        _objectContainer.Add(context.Existing);
    }
}

public class InstantiatedObjectsExtension : UnityContainerExtension
{
    private readonly ObjectContainer _objectContainer = new ObjectContainer();
    protected override void Initialize()
    {
        Context.Container.RegisterInstance(_objectContainer);
        Context.Strategies.Add(new InstantiatedObjectsStrategy(_objectContainer),
            UnityBuildStage.PostInitialization);
    }
}

扩展可以在创建后立即添加到UnityContainer:

IUnityContainer container = new UnityContainer();
container.AddNewExtension<InstantiatedObjectsExtension>();

然后可以在稍后阶段从容器中检索实例化的对象,如下所示:

IEnumerable<object> instantiatedObjects = container.Resolve<ObjectContainer>().GetInstantiatedObjects();
IEnumerable<Foo> instantiatedFoos = container.Resolve<ObjectContainer>().GetInstantiatedObjects<Foo>();
© www.soinside.com 2019 - 2024. All rights reserved.