powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / IoC-контейнер для использования с MVVM: где хранить?
25 сообщений из 97, страница 1 из 4
IoC-контейнер для использования с MVVM: где хранить?
    #38310578
IoC Lacks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой вот вопрос. Допустим, я для своих целей использую Ninject, конструкторы/свойства/методы максимально отвязаны от конкретных реализаций, и оперируют интерфейсами. Соответственно, для обращения к ним нужно отрезолвить нужные зависимости, и передать нужным образом. Для резолвинга нужен экземпляр IoC-контейнера. Лучшие собаководы вроде как рекомендуют инжектить зависимости в нужном наборе фабрик в нужных местах (а не в точке входа в приложение всем скопом), далее использовать фабрики. Тут начинаются вопросы:
1) мы начнем обращаться к конкретным реализациям фабрик? Но получается же, что DI, таким образом, нарушается - в точке вызова мы оперируем с конкретной реализацией?
2) допустим, мы заинжектили и фабрики. Но тогда в точках обращения к фабрикам нам опять нужна ссылка на контейнер.
И где этот контейнер хранить? Сделать его синглтоном и чем-то типа ServiceLocator? Опять получаем зависимость от конкретной реализации, причем сквозную по всему проекту.
Наконец, причем здесь MVVM. Если речь идет о невизуальных классах с узкой спецификой, то мы можем их инжектить максимально близко к точке использования. А вот если, например, нам надо заинжектить что-то типа IMessageBoxService, используемый во всех моделях приложения? Инжектить его в конструкторе каждой модели - не видно особого смысла, т.к. у сервиса нет состояния, и он один абсолютно одинаковый для всех. А если не инжектить в каждой модели - то надо инжектить один раз на всё приложение. Опять упираемся во что-то типа сервис-локатора-синглтона. И что тут делать?
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310598
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC LacksА вот если, например, нам надо заинжектить что-то типа IMessageBoxService, используемый во всех моделях приложения? Инжектить его в конструкторе каждой модели - не видно особого смысла, т.к. у сервиса нет состояния, и он один абсолютно одинаковый для всех.Сегодня нет состояния, завтра может появиться. Сегодня он синглетон, завтра он ThreadStatic-синглетон, послезавтра ещё что... Но это маразм конечно, основанный на неуверенности в завтрашнем дне.

зы: У нас MessageBoxService всегда был обычным статическим классом, дискомфорта никакого...
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310599
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC LacksИнжектить его в конструкторе каждой модели - не видно особого смысла, т.к. у сервиса нет состояния, и он один абсолютно одинаковый для всех. А если не инжектить в каждой модели - то надо инжектить один раз на всё приложение.Инжектить можно через публичные свойства, вынесенные в базовый для всех вьюмоделей класс.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310643
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кзы: У нас MessageBoxService всегда был обычным статическим классом, дискомфорта никакого...
+100
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310747
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КУ нас MessageBoxService всегда был обычным статическим классом, дискомфорта никакого...
У вас никогда не было автоматизированного тестирования. :)
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310754
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorАлексей КУ нас MessageBoxService всегда был обычным статическим классом, дискомфорта никакого...
У вас никогда не было автоматизированного тестирования. :)
Тестировать мессадж бокс? Не смеши :)
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310768
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC Lacks,

Вы не понимаете принцип Dependency Inversion, и соответсвенно технику применения Dependecy Injection контейнеров. Всё о чём вы пишите - сплошной анти-паттерн ServiceLocator .
Какую зависимость какой компонент получит - надо решать на уровне конфигурации контейнера, а не в классах приложения. Абстрактные фабрики при наличии контейнера - ненужная вещь. Контейнер и так классная фабрика, сделает что надо, сколько надо, и когда надо.

Для вашего IMessageBoxService можно использовать то, что Seamann назыает Ambient Contex (хотя я бы всё равно инжектил). Только не забудьте его инициализировать его при старте приложения, и предусмотреть возможность замены.

Чтобы привести мысли в правильное русло раздобудьте себе Dependency Injection in .NET . Там кратко и по делу.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310822
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorМСУЧего вы там во вьюмоделе/контроллере/презентере тестировать собрались? Тестировать модель надо, а она далека от MessageBoxService.

Не надо мешать логику с UI, тогда костыли не понадобятся. Тестировщики-любители блин...
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310876
IoC Lacks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я же и пишу, что стараюсь уйти от вариантов с ServiceLocator'ом. Основной вопрос сводился к следующему: допустим, мы определили зависимости для компонентов в конфигурации контейнера. Теперь в нужном месте нам по зависимости нужен экземпляр компонента. У кого его получить? у контейнера? А откуда получить контейнер? Каждый раз его инстанциировать заново?
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310882
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC LacksТак я же и пишу, что стараюсь уйти от вариантов с ServiceLocator'ом. Основной вопрос сводился к следующему: допустим, мы определили зависимости для компонентов в конфигурации контейнера. Теперь в нужном месте нам по зависимости нужен экземпляр компонента. У кого его получить? у контейнера? А откуда получить контейнер? Каждый раз его инстанциировать заново?
Ну, видимо, контейнер создаётся при старте приложения. "Корневой" сервис создаётся через явное обращение к этому контейнеру. А дальше всё через иньекции.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310904
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC LacksА откуда получить контейнер? Каждый раз его инстанциировать заново?
Это же статика, экземпляр контейнера один.

Код: c#
1.
var service = DependencyResolver.Current.GetService<IDataService>()
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310957
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ке надо мешать логику с UI, тогда костыли не понадобятся. Тестировщики-любители блин...
А логику представления тестировать не надо например? Скажем есть у нас кнопка "DeleteFoo" у которой свойство Enabled прибиндено к свойству модели MVVM DeleteEnabled. Свойство должно быть true, только если юзер выбрал объект, и этот объект не удалён. При вызове delete спросить уверен ли юзер в своём желании удалять. Если не уверен - не удалять.

Это всё логика, которой не место в бизнес слое. Ее можно и полезно тестировать.

Тестировщик-профессионал, блин. :)
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310982
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorА логику представления тестировать не надо например? Скажем есть у нас кнопка "DeleteFoo" у которой свойство Enabled прибиндено к свойству модели MVVM DeleteEnabled. Свойство должно быть true, только если юзер выбрал объект, и этот объект не удалён. При вызове delete спросить уверен ли юзер в своём желании удалять. Если не уверен - не удалять.

Это всё логика, которой не место в бизнес слое. Ее можно и полезно тестировать.Тестировать "это" - маразм.
SolYUtorТестировщик-профессионал, блин. :)Да. :-)
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310988
IoC Lacks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУЭто же статика, экземпляр контейнера один.

Код: c#
1.
var service = DependencyResolver.Current.GetService<IDataService>()


В случае с упомянутым Ninject пример использования выглядит примерно как
Код: c#
1.
2.
3.
4.
IKernel kernel = new StandardKernel();
kernel.Bind<ISomeClass>().To<SomeClass>();

SomeClass sc = kernel.Get<ISomeClass>();


В случае, например, с Castle Windsor, код немногим отличается:
Код: c#
1.
2.
3.
4.
container = new WindsorContainer();
container.Install(...);

var start = container.Resolve<IShell>();


- контейнер инстанциируется явным образом. Т.е. для того, чтобы им воспользоваться, мы должны либо поместить его внутрь синглтона/статического класса - получаем ServiceLocator, либо хранить где-то в корне приложения ссылку, и постоянно передавать её по цепочке в конструкторы. Ни то, ни другое у меня как-то не вызывают оптимизма.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38310993
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC LacksТ.е. для того, чтобы им воспользоваться, мы должны либо поместить его внутрь синглтона/статического класса - получаем ServiceLocator, либо хранить где-то в корне приложения ссылку, и постоянно передавать её по цепочке в конструкторы. Ни то, ни другое у меня как-то не вызывают оптимизма.Есть смысл ещё раз прочитать мои ответы.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311034
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу, видимо, контейнер создаётся при старте приложения. "Корневой" сервис создаётся через явное обращение к этому контейнеру. А дальше всё через иньекции.
Алексей КЕсть смысл ещё раз прочитать мои ответы.

Редкий случай, когда я согласен с Алексеем.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311044
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC Lacksконтейнер инстанциируется явным образом
И в чем проблема?

IoC LacksТ.е. для того, чтобы им воспользоваться, мы должны либо поместить его внутрь синглтона/статического класса - получаем ServiceLocator
Глупости.

1. Синглтон не обязан быть сервис локатором.
2. Причем тут синглтон? Он не панацея.
3. Причем тут статический класс? Класс не обязан быть статическим, речь о статическом методе и только.
4. Достаточно иметь статический метод, который будет отдавать отрезолвленный интерфейс.

IoC LacksНи то, ни другое у меня как-то не вызывают оптимизма.
У тебя каша в голове.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311100
IoC Lacks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУУ тебя каша в голове.
Касательно обсуждаемой темы - не спорю. Иначе зачем мне было бы эту тему заводить? Я и рассчитываю с помощью этой темы несколько разобраться в обсуждаемом.
Итак, насколько я понял, мне намекают на что-то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class DependencyResolver
{
  static readonly IKernel сurrent = new StandardKernel();
  static DependencyResolver()
  {
    current.Bind<ISomeClass>().To<SomeClass>();
    .....
  }
  
  public static IKernel Current
  {
    get { return current; }
  }
}


и далее в коде
Код: c#
1.
var someClass = DependecyResolver.Current.Get<ISomeClass>();


так?
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311142
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC Lacksи далее в коде при старте приложения
Код: c#
1.
var someClass = DependecyResolver.Current.Get<ISomeClass>();

Добавил.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311170
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC Lacksтак?
Типа того.

Вот код штатного DI для ASP.NET MVC

Код: c#
1.
2.
3.
4.
5.
6.
public interface IDependencyResolver
{
    // Methods
    object GetService(Type serviceType);
    IEnumerable<object> GetServices(Type serviceType);
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private sealed class CacheDependencyResolver : IDependencyResolver
{
    // Fields
    private readonly ConcurrentDictionary<Type, object> _cache;
    private readonly ConcurrentDictionary<Type, IEnumerable<object>> _cacheMultiple;
    private readonly IDependencyResolver _resolver;

    // Methods
    public CacheDependencyResolver(IDependencyResolver resolver);
    public object GetService(Type serviceType);
    public IEnumerable<object> GetServices(Type serviceType);
}



DependencyResolver
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
public class DependencyResolver
{
    // Fields
    private IDependencyResolver _current;
    private CacheDependencyResolver _currentCache;
    private static DependencyResolver _instance;

    // Methods
    static DependencyResolver();
    public DependencyResolver();
    public void InnerSetResolver(object commonServiceLocator);
    public void InnerSetResolver(IDependencyResolver resolver);
    public void InnerSetResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);
    public static void SetResolver(object commonServiceLocator);
    public static void SetResolver(IDependencyResolver resolver);
    public static void SetResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);

    // Properties
    public static IDependencyResolver Current { get; }
    internal static IDependencyResolver CurrentCache { get; }
    public IDependencyResolver InnerCurrent { get; }
    internal IDependencyResolver InnerCurrentCache { get; }

    // Nested Types
    private sealed class CacheDependencyResolver : IDependencyResolver
    {
        // Fields
        private readonly ConcurrentDictionary<Type, object> _cache;
        private readonly ConcurrentDictionary<Type, IEnumerable<object>> _cacheMultiple;
        private readonly IDependencyResolver _resolver;

        // Methods
        public CacheDependencyResolver(IDependencyResolver resolver);
        public object GetService(Type serviceType);
        public IEnumerable<object> GetServices(Type serviceType);
    }

    private class DefaultDependencyResolver : IDependencyResolver
    {
        // Methods
        public DefaultDependencyResolver();
        public object GetService(Type serviceType);
        public IEnumerable<object> GetServices(Type serviceType);
    }

    private class DelegateBasedDependencyResolver : IDependencyResolver
    {
        // Fields
        private Func<Type, object> _getService;
        private Func<Type, IEnumerable<object>> _getServices;

        // Methods
        public DelegateBasedDependencyResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);
        public object GetService(Type type);
        public IEnumerable<object> GetServices(Type type);
    }
}

...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311201
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IoC LacksМСУУ тебя каша в голове.
Касательно обсуждаемой темы - не спорю. Иначе зачем мне было бы эту тему заводить? Я и рассчитываю с помощью этой темы несколько разобраться в обсуждаемом.
Итак, насколько я понял, мне намекают на что-то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class DependencyResolver
{
  static readonly IKernel сurrent = new StandardKernel();
  static DependencyResolver()
  {
    current.Bind<ISomeClass>().To<SomeClass>();
    .....
  }
  
  public static IKernel Current
  {
    get { return current; }
  }
}


и далее в коде
Код: c#
1.
var someClass = DependecyResolver.Current.Get<ISomeClass>();


так?

Эта унылая шняго из ASP.net mvc создана только для таких как MCУ, который в глаза не видел нормальные контейнеры.
Их применение должно быть изначально заложено в архитектуру, почитай доки по prism. В них достаточно внятно объяснено для чего они нужны и что для этого должно быть.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311245
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЭта унылая шняго из ASP.net mvc создана только для таких как MCУ, который в глаза не видел нормальные контейнеры.
Это замечательный возможность использовать штатный mvc-шный резолвер. А те, вроде тебя, у кого не хватает мозгов это понять, могут вещать дальше о правильный контейнерах и убитой кастрированной поделке prism.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311339
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

IDependencyResolver в MVC - это ошибка. Правильный путь - реализовывать IControllerFactory.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311352
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorМСУ, IDependencyResolver в MVC - это ошибка.
С чего это?

SolYUtorПравильный путь - реализовывать IControllerFactory.
Путь тоже хороший, не спорю.
...
Рейтинг: 0 / 0
IoC-контейнер для использования с MVVM: где хранить?
    #38311380
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

контейнеры склонны контролировать жизненный цикл созданных ими объектов. Во многих случаях требуется явно указать контейнеру, когда объект можно уничтожать. Register-Resolve-Release цикл. Так вот, DependencyResolver не предоставляет способа "отпускать" объекты.
...
Рейтинг: 0 / 0
25 сообщений из 97, страница 1 из 4
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / IoC-контейнер для использования с MVVM: где хранить?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]