Member 11380736 Ответов: 0

Как зарегистрировать экземпляр вложенного универсального интерфейса в контейнере внедрения зависимостей


Я пытаюсь создать динамическую архитектуру для приложения аудио/видео плеера.

Я хочу иметь возможность изменять тип списка воспроизведения и тип репозитория изнутри контейнера ioc.

Это должно быть введено в конструкторы вокруг приложения:
IPlaylist<IMedia> playlist, IRepository<IPlaylist<IMedia>> playlistRepository


В настоящее время я могу изменить тип списка воспроизведения, но у меня возникли проблемы с поиском решения для правильной регистрации зависимости репозитория.

Универсальный IPlaylist:
public interface IPlaylist<TMedia> where TMedia : IMedia
 {
   string PlaylistName { get; set; }
   IList<TMedia> Media { get; set; }
 }


SongPlaylist:
public class SongPlaylist: IPlaylist<Song>
 {
   public string PlaylistName { get; set; }
   public IList<Song> Media { get; set; }
 }


MediaPlaylist как для песен, так и для видео:
 public class MediaPlaylist : IPlaylist<Media>
  {
    public string PlaylistName { get; set; }
    public IList<Media> Media { get; set; }
  }
}


Интерфейс репозитория:
public abstract class RepositoryBase<TConnection, TEntity> : IRepository<TEntity> where TEntity : class


Хранилище для песен:
public class SongPlaylistRepository : RepositoryBase<SignalRConnection, IPlaylist<Song>>


Хранилище для песен и видео:
public class MediaPlaylistRepository : RepositoryBase<SignalRConnection, IPlaylist<Media>>


Контейнер Dryioc: здесь я регистрирую общий IPlaylist, который работает:
containerRegistry.Register(typeof(IPlaylist<>), typeof(SongPlaylist));


Это то, что я хотел бы сделать, но я получаю "неожиданное использование несвязанного родового имени":
containerRegistry.RegisterInstance<IRepository<IPlaylist<>>>(new SongPlaylistRepository(new SignalRConnection(new HubConnection("https://webapiaddress.com/"), "hub")));


Что я уже пробовал:

Я перепробовал много разных вещей, но я не могу понять, является ли моя архитектура слишком удаленной или я просто не использую соответствующий контейнер для инъекций зависимостей.

Gerry Schmitz

Выглядит чересчур продуманным. Используйте "пользовательские" коллекции только тогда, когда "универсальные" не будут работать (что почти никогда не бывает).

Member 11380736

Мне нужно использовать пользовательский список

0 Ответов