Resharper и IoC контейнеры: теперь знакомы! или плагин Agent Mulder

    Доброго времени,

    Как известно, Resharper решает много проблем по работе с кодом, но все-таки не все.

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



    Рассмотрим простой пример (используется IoC контейнер Unity от Microsoft).
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IMovieRepository, InMemoryMovieRepository>();
        container.RegisterType<IMovieFinder, MovieFinder>();
    



    В этом примере Resharper «не знает» где используется конструктор MovieFinder и выдает сообщение (по команде Find Usages) «Usages of 'MovieFinder(...)' was not found».
        public class MovieFinder: IMovieFinder
        {
            readonly IMovieRepository repository;
    
            public MovieFinder(IMovieRepository repository)
            {
                this.repository = repository;
            }
            ...
         }
    




    Еще хуже обстоит дело, если в регистрации не используется имя класса. В этом случае класс будет показан Resharper-ом как не используемый.

    Но, для того чтобы «познакомить» Resharper и IoC контайнеры нашлось решение.
    Видимо пользуюясь известной фразой "пусть все будет, но чего то не хватает", разработчики Resharper-а добавили возможность написания плагинов.
    Этим то и воспользовался Igal Tabachnik.

    Плагин Agent Mulder анализирует контейнеры и обеспечивает удобную навигацию между классами и их регистрацией.

    Итак, плагин обеспечивает 3 главные возможности:

    1. Помечает классы, зарегистрированные в контейнере, специальной иконкой:
    image

    2. Обеспечивают навигацию от определения класса к месту регистрации.

    3. И обратно, навигацию от регистрации до определения классов.
    image

    Работает все быстро и точно, но, к сожалению, иногда (VS2010 + Reshaper 6.1) навигация работает не так идеально, как хотелось бы. Надеюсь эти недостатки будут быстро устранены, потому что вещь полезная в хозяйстве.

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

    Сайт плагина: http://hmemcpy.github.com/AgentMulder/ содержит простое, но ясное описание. Имеется видео, которое объясняет еще проще.

    Плагин уже попал на сайт Resharper-а. Я там насчитал 17 плагинов, из них 4 агента.

    Список поддерживаемых контейнеров может быть найден тут https://raw.github.com/hmemcpy/AgentMulder/master/WhatsNew.txt.
    Кстати, по хорошему надо написать систему плагинов для этого плагина, что бы добавлять свои IoC контейнеры :).

    Детальное видео "Дмитрий Нестерук. ReSharper: Архитектура и Расширения" от mezastel может послужить введением в мир плагинов от решарпера.

    Игорь.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 25

      +2
      Интересная штука, спасибо.
      Как пожелание — добавить поддержку resharper7/vs11 и было бы совсем здорово.
      +1
      Пользуясь случаем, хочу также порекоммендовать скринкаст про ReSharper SDK.
        +2
        Спасибо, действительно не хватало этого.
          +1
          автор плагина спрашивает, если кто может пожертвовать ему инвайт на habrahabr
            +3
            Получил, всем огромное спасибо!
            +3
            Огромное спасибо, Игорь, за статью!

            Очень рад что плагин понравился, обязательно доработаю глюки в нем.
            Поддержку контейнеров можно добавить прямо сейчас, ребята из Catel сейчас это как раз и делают.

            Сам плагин работает на основе structured search Решарпера (SSR) — поиск паттернов в коде. Подробную информацию можно найти на wiki проекта на гитхабе. Там же и инструкции по расширению плагина и как добавить свой IoC/DI контейнер, и лист поддерживаемых на данный момент фичеров.
              0
              Спасибо за плагин. Одно плохо не всегда работает:

                0
                Гм… интересно, вроде должно. Скажите пожалуйста, а ApplicationCache не nested случайно? Или как то по «особенно» декларирован?
                  0
                  Всё без nested, находятся в одной сборке, и вроде бы ничего особенного там нет. Такая ситуация не только с ApplicationCache.

                  JetBrains ReSharper 6.1 C# Edition
                  Build 6.1.37.86 on 2011-12-20T18:15:24

                  Plugins: 1
                  #1. “Agent Mulder plugin for ReSharper” v1.0.4.0 by “Igal Tabachnik”
                  Visual Studio 10.0.40219.1.
                    0
                    Я собираюсь добавлять логи в следующем билде. Буду очень благодарен если сможете установить и потом прислать мне лог.

                    Надеюсь что через пару дней будет уже.
                      0
                      Ок. Пишите в хабрапочту или в скайп
                0
                У нас в solution'e есть несколько проектов, в которых происходит регистрация одних и тех же компонентов.
                Можно ли сделать так, чтобы при щелчке на magic hat выпадал список мест, где зарегистрирован компонент?
                  0
                  Да, это запланировано. У меня самого такая же проблема если я открываю проект самого контейнера (Ninject, на пример) — их тесты используют те же самые типы везде, а Молдер не узнает все места где он используется. Так что починим!

                  Если не сложно, не могли бы Вы написать ето в issues на гитхабе?
                    0
                    Вы, похоже, раньше уже сами зарегистрировали: github.com/hmemcpy/AgentMulder/issues/14
                      0
                      Да, просто в твиттере то же кто-то заметил, так что я и написал, чтобы не забыть. Но все равно спасибо.
                0
                Да, это запланировано. У меня самого такая же проблема если я открываю проект самого контейнера (Ninject, на пример) — их тесты используют те же самые типы везде, а Молдер не узнает все места где он используется. Так что починим!

                Если не сложно, не могли бы Вы написать ето в issues на гитхабе?
                  0
                  кстати, я хотел скомпилировать агента, но так как он много чего хочет, то не получилось.
                    0
                    мой предыдущий комментарий опубликован по ошибке.
                      0
                      Вот как, когда редактировать комменты нельзя :)

                      Проекту требуется только ReSharper SDK 6.1.x. Все остальные зависимости (например, контейнеры для тестов), должны скачатся сами при первом ребилде (установлен NuGet Package Restore).
                        0
                        я так и понял, поэтому не хотел публиковать коммент, но рука дрогнула.
                        к сожалению рабочая сеть не позволяет скачивать пакеты через nuget ;(
                          0
                          unity не приехал через nuget
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Здравствуйте, Sedot,

                      Спасибо вам за совет, действительно на данный момент плагин очень связан с семантикой того или иного контейнера. Если честно, я не люблю использовать ServiceLocator, так как он привязывает контейнер как глобальную зависимость.

                      Точно не могу сказать, но возможно то что вы предлагаете можно решить другим способом, например как аннотейшены в самом Решарпере — возможность нарядить ваш метод RegisterSingletonService каким нибудь атрибутом, который плагин поймет и будет считать за «родной».

                      Кстати идея неплохая совсем :) Но это наверное в vNext…
                      • НЛО прилетело и опубликовало эту надпись здесь

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

                    Самое читаемое