Unity:按特定顺序解析所有已注册类型实例的列表

Unity: Resolve list of all registered instances of type in specific order

我正在注册一个特定 class 的多个实例来实现一些接口(在示例 IInteractivityTarget 中)。

RootContainer.RegisterInstance<IInteractivityTarget>(Name, new InteractivityTarget(Name));

我还注册了该类型的Enumerable,自动解析所有注册实例的列表。

Container.RegisterType<IEnumerable<IInteractivityTarget>, IInteractivityTarget[]>();

现在的问题是我没有机会定义一些排序 (-info) 来在解析项目时按特定顺序获取这些项目。如何实现?我不想使用 SortHint-属性.

扩展 IInteractivityItem

更详细的示例:

public void RegisterInteractivity(string name, string sortHint){
    if (!Container.IsRegistered(typeof(IEnumerable<IInteractivityTarget>))){
            Container.RegisterType<IEnumerable<IInteractivityTarget>, IInteractivityTarget[]>();
    }

    Container.RegisterInstance<IInteractivityTarget>(Name, new InteractivityTarget(Name, sortHint));
}

RegisterInteravtivity("Show in View A", "aaa");
RegisterInteravtivity("Show in View A", "bbb");
RegisterInteravtivity("Show in View A", "ddd");
RegisterInteravtivity("Show in View A", "eee");
RegisterInteravtivity("Show in View A", "ccc");
RegisterInteravtivity("Show in View A", "aab");


/// --> this should be resolved ordered by SortHint
var interactivityTargets = Container.Resolve<IEnumerable<IInteractivity>>()

I dont want to extend the IInteractivityItem with a SortHint-property

您将需要某种排序提示,可以是 属性 或属性。

或者,您可以创建一个保留顺序的自定义注册表。

示例:

public interface IInteractivityRegistry
{
    void Add<T>() where T : IInteractivity;
    IReadOnlyList<IInteractivity> ResolveAllInOrder();
}

internal class UnityInteractivityRegistry : IInteractivityRegistry
{
    public UnityInteractivityRegistry(IUnityContainer container)
    {
        _container = container;
    }

    #region IInteractivityRegistry
    public void Add<T>() where T : IInteractivity
    {
        _interactivities.Add( typeof(T) );
    }

    public IReadOnlyList<IInteractivity> ResolveAllInOrder()
    {
        return _interactivities.Select( x => _container.Resolve( x ) ).ToArray();
    }
    #endregion

    #region private
    private readonly List<Type> _interactivities = new List<Type>();
    private readonly IUnityContainer _container;
    #endregion
}

请注意,我们注入了容器,尽管这显然是一种代码味道。但是 UnityInteractivityRegistry 或多或少是对容器的扩展,所以我想,这是有道理的。此外,在实际应用程序中,IInteractivityRegistry 当然必须拆分为两个接口。