Как я могу разрешить несколько дочерних элементов одного и того же интерфейса, зарегистрированных в IContainerRegistry? ⇐ C#

Место общения программистов C#
Anonymous
Как я могу разрешить несколько дочерних элементов одного и того же интерфейса, зарегистрированных в IContainerRegistry?

Сообщение Anonymous »

Я новичок в Prism и, в частности, в среде .NET.
Это краткое описание проблемы:
У меня есть иерархия из нескольких интерфейсов (, IHuman, IElf, IVampire, ISaiyan) дочерние элементы одного и того же родительского интерфейса (

Код: Выделить всё

IPlayer). Каждый листовой интерфейс, конечно, имеет свои классы реализации (Robot
, Человек, Эльф, Вампир, Саян). IPlayer имеет метод void Initialize().
В классе GameModule (дочернем элементе Prism.Modularity.IModule) происходит регистрация всех реализаций в том же родительском интерфейсе, что и синглтоны:

Код: Выделить всё

public class GameModule: IModule
{

private void RegisterPlayers(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
[...]
}

}
Позже в BattleGrid мне нужно разрешить все эти реализации для вызова одного и того же метода Initialize() следующим образом:

Код: Выделить всё

public class BattleGrid
{

private readonly IEnumerable _players;

public BattleGrid(IEnumerable players){
_players = players;
}

public void InitializeAllPlayers() => _players .ForEachDo(player=>player.Initialize());
}
К сожалению, это не работает. Как это решить?
Сейчас я использовал этот "трюк с двойной регистрацией", но он мне не очень нравится: в классе GameModule я сначала регистрирую все реализации со связанным интерфейсом, затем я регистрирую список IPlayer, разрешая каждый зарегистрированный интерфейс:

Код: Выделить всё

public class GameModule: IModule
{

private void RegisterPlayers(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
[...]

containerRegistry.RegisterSingleton(
container => new List
{
container.Resolve(),
container.Resolve(),
[...]
}
);
}
}
Мне это не нравится, потому что другой разработчик будет часами бороться, прежде чем обнаружит этот «трюк с двойной регистрацией».

Подробнее здесь: https://stackoverflow.com/questions/791 ... tered-in-i

Вернуться в «C#»