@xXNullXx

Для чего нужны контейнеры и регистрация компонентов?

Доброго времени суток!

Начал изучать полную реализацию паттерна WVVM. Походу изучения узнал, часто пользуются библиотекой "PRISM"(начал и ее изучать). Походу изучения "PRISM" узнал, что реализовываются какие то контейнеры. И вот собственно первые несколько вопросов: Что такое контейнер в данном контексте и для чего он нужен? Так же в этом контейнеры происходит регистрация зависимостей. Вот поток вопросов: Что за регистрация зависимостей и для чего это нужно?

Вот собственно пример:
public class Bootstrapper : AutofacBootstrapper
    {
        protected override DependencyObject CreateShell() => Container.Resolve<Shell>();

        protected override void InitializeShell()
        {
            base.InitializeShell();

            Application.Current.MainWindow = (Window)Shell;
            Application.Current.MainWindow.Show();
        }

        protected override ContainerBuilder CreateContainerBuilder()
        {
            var builder = new ContainerBuilder();

            // регистрация зависимостей в контейнере
            // должны быть здесь...

            return builder;
        }
    }


Подытожу:
  • Что такое контейнеры?
  • Для чего нужны контейнеры?
  • Что такое регистрация зависимостей?
  • Для чего нужна регистрация зависимостей?
  • Дополнительный вопрос(если можно то ответе): есть ли какая та весомая разница между IoC такими как: Unity, AUTOFAC, MEF?


Откуда я в ОСНОВНОМ(но не все) про все это:
Вот эта серия статей

Заранее спасибо.
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
Контейнер хранилище зависимостей. Контейнер служит для разрешения зависимостей, те говорит какую конкретную реализацию подставить. У вас зависимость может быть интерфейс - класс реализация интерфейса, класс - наследник класса, просто класс. Так вот при регистрации вы сопоставляете тип и конкретную его реализацию.
Например
container.Register<IRegisterServer,DbRegisterService>();
container.Register<RegisterVieModel>();
.......
//Конструстор ViewModel
void RegisterViewModel(IRegisterService service)
{
}

Так вот, когда у ioc контейнера вы запрашиваете RegisterViewModel, он смотрит на параметры конструктора и в соответствии с типами в нем зарегистрированными, создаёт и подставляет в конструктор соответствующие типы. Зачем это надо, вы в любой момент можете поменять реализацию или сделать несколько реализаций и регистрировать их в зависимости от параметров запуска или ключей реестра. А вообще инверсия зависимостей служит для избавления кода от связанности. В примере выше, в VM используется не конкретный класс, а некий тип, описанный интерфейсом, если вам надо поменять реализацию, то вы поменяете только строчку реализации, а класс VM останется без изменений. На небольших проектах может и не заметна выгода, но в больших, над которыми несколько человек, даже очень.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы