Использование Контейнеров МОК; специфически Виндзорский

В Android Studio вы можете это сделать:

Например, если вы хотите изменить com.example.app на my.awesome.game, то:

  1. В вашем Панель проекта , щелкните значок маленькой шестерни (Gears icon [/g5])
  2. Снимите флажок
g30] Compact Empty Middle Packages [/g6]

  1. Теперь ваша папка пакета будет разбита на отдельные каталоги
  2. Индивидуально выберите каждый каталог, который вы хотите переименовать, и: щелкните по нему Refactor Нажмите Rename. В диалоговом окне «Всплывающее окно» нажмите Rename Package вместо «Переименовать каталог» Введите новое имя и нажмите «Refactor». Нажмите «Refactor» в нижней части. Разрешите минуту, чтобы Android Studio обновила все изменения. Примечание. При переименовании com в Android Studio это может привести к предупреждению. В этом случае выберите Переименовать все

enter image description here [/g7]

  1. Теперь откройте свой файл сборки Gradle (build.gradle - обычно app или mobile). Обновите applicationId к новому имени пакета и Sync Gradle, если он еще не был обновлен автоматически:

Refactor Directories [/g8]

  1. Возможно, вам понадобится изменить атрибут package= в вашем манифесте.
  2. Очистить и перестроить.
  3. Готово! В любом случае, Android Studio необходимо сделать этот процесс немного проще.
28
задан Andrew Bullock 14 December 2008 в 23:52
поделиться

5 ответов

99% случаев это - один контейнерный экземпляр на приложение. Обычно Вы инициализируете его в Application_Start (для веб-приложения), как это .

После этого, это действительно до потребителя контейнера. Например, некоторые платформы, как Монорельсовая дорога и ASP.NET MVC позволяет Вам прерывать создание экземпляров (контроллеры в этом случае), таким образом, Вы просто регистрируете контроллеры и их зависимости в контейнере и вот именно, каждый раз, когда Вы получаете запрос, контейнер заботится о введении каждого контроллера с его зависимостями. Посмотрите, например этот контроллер MVC ASP.NET . В этих платформах Вы почти никогда не должны называть или даже ссылаться на контейнер в своих классах, который является рекомендуемым использованием.

Другие платформы не позволяют Вам войти в процесс создания легко (как Веб-формы), таким образом, необходимо обратиться к взломам как этот , или получение по запросу необходимые зависимости (то есть, явно назвав контейнер). Для получения по запросу зависимостей используйте статический шлюз для контейнера как этот или тот, описанный maxnk. Обратите внимание путем выполнения этого, фактическое использование контейнера как услуга Локатор который не разъединяет вещи, а также инверсию управления. (см. различие здесь и здесь )

Hope это очищает Ваши сомнения.

24
ответ дан Community 14 October 2019 в 11:50
поделиться

Обычно Вы хотите сохранить только один экземпляр в течение времени жизни целого приложения. Что я делаю большую часть времени, я инициализирую контейнер, когда приложение запускается, и затем я использую введенные фабрики для контейнерного не зная получения по запросу объектов.

Другой популярный подход должен обернуть контейнерный экземпляр со статическим классом и использованием что статический класс для доступа к Вашему (одиночный элемент) контейнер. Можно найти пример этого в библиотеке Commons Носорога Ayende здесь . Этот подход однако имеет серьезные недостатки и должен избежаться.

3
ответ дан Krzysztof Kozmic 14 October 2019 в 11:50
поделиться

Я использую этот пример из блога Michael Puleio при использовании HttpModule для обработки сборки моих зависимостей с помощью Единицы. http://blogs.msdn.com/mpuleio/archive/2008/07/17/proof-of-concept-a-simple-di-solution-for-asp-net-webforms.aspx

1
ответ дан Chris Marisic 14 October 2019 в 11:50
поделиться

Я использую реализацию этого интерфейса:

public interface IResolver
{
    object Resolve(Type type);
    object Resolve(string name);

    T Resolve<T>() where T : class;
    T Resolve<T>(string name) where T : class;
}

, Который на самом деле обертывается в глобальный статический класс, например:

public static class Resolver // : IResolver
{
    private static IResolver _current;

    public static object Resolve(Type type)
    {
        return Current.Resolve(type);
    }

    public static object Resolve(string name)
    {
        return Current.Resolve(name);
    }

    public static T Resolve<T>() where T : class
    {
        return Current.Resolve<T>();
    }

    public static T Resolve<T>(string name) where T : class
    {
        return Current.Resolve<T>(name);
    }

    private static IResolver Current
    {
        get
        {
            if (_current == null)
            {
                _current = new SpringResolver();
            }

            return _current;
        }
    }
}

Также я пытаюсь следовать, простое правило - используют класс Преобразователя максимально меньше, вместо этого вводят сервисы в объектах, которым нужны те сервисы.

0
ответ дан maxnk 14 October 2019 в 11:50
поделиться

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

Тем не менее IMO, наличие глобального контейнера, к которому получают доступ всюду по Вашему приложению несколько, повреждает изоляцию в этом много кода теперь, зависит от одного глобального класса. Кроме того, для приложений, который разделяется в несколько блоков, глобальный контейнер должен быть сделан доступным для всех этих блоков.

С Единицей у Вас может на самом деле быть параметр IUnityContainer в Вашем конструкторе, и контейнер автоматически введется в экземпляр при разрешении класса. Таким образом, для сервисов, который должен разрешить другие сервисы, которые Вы передаете в контейнере вместо того, чтобы вынудить класс сослаться на внешний класс.

Не уверенный, как другие платформы поддерживают этот сценарий (Виндзор введет IKernel).

1
ответ дан Krzysztof Kozmic 28 November 2019 в 03:46
поделиться
Другие вопросы по тегам:

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