Mvvm light SimpleIoC в пользовательском контроле - PullRequest
1 голос
/ 22 апреля 2019

Я надеюсь, что кто-то может пролить свет на лучшую практику для моего варианта использования.

Я использую mvvm light и контейнер simpleIoC в пользовательском контроле wpf.Я регистрирую свою модель и смотрю на нее модели, службы данных и службы времени разработки (в значительной степени в соответствии с легким примером кода mvvm)

Примеры использования контейнера SimpleIoC, которые я видел, кажется, всегда рассматривают контейнер как статический / глобальный дляПространство имен GalaSoft.

Но если бы я создал два экземпляра своего элемента управления WPF в одном приложении, я бы, конечно, хотел, чтобы каждый пользовательский элемент управления имел свой собственный набор виртуальных машин и экземпляр модели.Так что в основном это собственный набор зарегистрированных экземпляров SimpleIoC.Как мне лучше всего это сделать, когда контейнер IoC по умолчанию выглядит как статический объект?

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Когда вы получаете экземпляр, вы можете указать ключ.Хотя по умолчанию вы получаете синглтон для каждого типа, он генерирует еще одну кэшированную версию этого типа для каждого ключа.Это означает, что вы можете использовать guid или что-то в качестве ключа для каждого экземпляра, который вам необходим.

Однако есть потенциальная проблема.Если вы получаете 100 разных версий, то все они находятся в памяти на весь срок службы вашего приложения.

Вы, вероятно, в порядке, если это будет только несколько экземпляров.

Большеи вам, вероятно, лучше всего использовать более сложный контейнер di.SimpleIoC предназначен только для простых случаев использования.

Однако при получении экземпляра вы можете использовать фабричный метод.Это не в моем вкусе, но если вы действительно хотели использовать simpleioc, то это то, что нужно учитывать.

Вы можете прочитать больше о Лоране Буньоне здесь.

https://msdn.microsoft.com/en-us/magazine/jj991965.aspx

0 голосов
/ 23 апреля 2019

Как мне лучше всего это сделать, когда контейнер IoC по умолчанию выглядит как статический объект?

Не используйте контейнер по умолчанию, но создайте свой собственный экземпляр класса SimpleIoc:

Пользовательский контроль A:

SimpleIoc containerA = new SimpleIoc();
containerA.Register<ViewModel>();
...
ViewModel vm = containerA.GetInstance<ViewModel46>();

Пользовательский контроль B:

SimpleIoc containerB = new SimpleIoc();
...
0 голосов
/ 23 апреля 2019

Это то, для чего предназначен шаблон фабрики, вы создаете класс, который создает ваши модели управляющего представления, и вместо этого внедряете его.

Лучшее разделение интересов также.

...