Unity: Разрешить список всех зарегистрированных экземпляров типа в определенном порядке - PullRequest
0 голосов
/ 23 октября 2018

Я регистрирую несколько экземпляров определенного класса, реализующего некоторый интерфейс (в примере IInteractivityTarget).

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

Я также зарегистрировал Enumerable типа, чтобы автоматически разрешать список всехзарегистрированные экземпляры.

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

Теперь проблема в том, что у меня нет шансов определить какой-то порядок (-info), чтобы получить элементы в определенном порядке при их разрешении.Как этого достичь?Я не хочу расширять IInteractivityItem с помощью свойства SortHint.


Более подробный пример:

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>>()

1 Ответ

0 голосов
/ 25 октября 2018

Я не хочу расширять элемент IInteractivityItem с помощью свойства SortHint

Вам понадобится какой-то тип подсказки по сортировке, либо как свойство, либо как атрибут.

В качестве альтернативы, вы можете создать собственный реестр, в котором сохранен порядок.

Пример:

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, разумеется, придется разделить на два интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...