Что делает это означает в Призме/Единица: Контейнер. Твердость <ShellPresenter> ()

Для множественного разрешения вы можете использовать этот код:

final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

private void insertDummyContactWrapper() {
    List<String> permissionsNeeded = new ArrayList<String>();

    final List<String> permissionsList = new ArrayList<String>();
    if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION))
        permissionsNeeded.add("GPS");
    if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))
        permissionsNeeded.add("Read Contacts");
    if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))
        permissionsNeeded.add("Write Contacts");

    if (permissionsList.size() > 0) {
        if (permissionsNeeded.size() > 0) {
            // Need Rationale
            String message = "You need to grant access to " + permissionsNeeded.get(0);
            for (int i = 1; i < permissionsNeeded.size(); i++)
                message = message + ", " + permissionsNeeded.get(i);
            showMessageOKCancel(message,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                        }
                    });
            return;
        }
        requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
        return;
    }

    insertDummyContact();
}

private boolean addPermission(List<String> permissionsList, String permission) {
    if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
        permissionsList.add(permission);
        // Check for Rationale Option
        if (!shouldShowRequestPermissionRationale(permission))
            return false;
    }
    return true;
}
17
задан Edward Tanguay 11 March 2009 в 14:20
поделиться

4 ответа

Вы понимаете основы.

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

точка контейнеров DI - то, что можно настроить их для изменения типа, который разрешен для конкретного интерфейса, не перекомпилировав программное обеспечение. Пример кода Вы предусмотрели конфигурирование поставщика, не может быть изменен во времени выполнения. Вот почему большинство инжекторов зависимости позволяет Вам настраивать их в app.config/web.config/some другой внешний конфигурационный файл. Тем путем можно реконфигурировать приложение для введения другого типа без перекомпиляции, которая является истинным питанием платформ DI как Единица.

5
ответ дан 30 November 2019 в 14:06
поделиться

Ну, я не могу ответить за Untiy, но за замок Windsor, регистрация могла быть в app.config/web.config файле. Существует также способность добавить параметры в конфигурации xml.

Это позволяет Вам изменять реализацию и конфигурацию объекта, не имея необходимость перекомпилировать Вас приложение.

1
ответ дан 30 November 2019 в 14:06
поделиться

В Единице, существует действительно Container.RegisterType<TFrom, TTo>() набор метода, который регистрирует типы во времени выполнения. Вероятно, более распространено сделать это с помощью конфигурационного XML-файла, но любого работы.

Интересно, в Единице нет никакого Container.Resolve<T>(params object[] parameters) - метод типа для разрешения типа с определенными значениями параметров конструктора. Единица создается сверху ObjectBuilder, который является P& P библиотека команды для того, чтобы сделать объектную конструкцию и wireup (IIRC это было первоначально записано для ObjectSpaces, но было значительно улучшено теперь). ObjectBuilder дает Вам способность ввести зависимости различными способами, включая через конструктора, таким образом, Вы могли сказать - например - передачу нового экземпляра типа, от которого это зависит в конструктора разрешенного типа; но тот тип должен был бы также быть зарегистрирован. Можно также передать экземпляры зарегистрированных типов (зарегистрированный экземпляр / одиночный элемент и т.д.). Но AFAICS там не является никаким способом просто дать ему значение для передачи в.

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

я не могу говорить за Виндзор, StructureMap или другие, которые могут позволить Вам делать это. Я не могу даже сказать категорически, что Единица не имеет никакого способа сделать это, так как я являюсь довольно новым в нем, но Chris Tavares IIRC - кто в основном создал Единицу - зависает здесь время от времени, поэтому возможно, он зайдет и ответит на этот:-)

1
ответ дан 30 November 2019 в 14:06
поделиться

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

Поэтому, когда вы запрашиваете ShellPresenter и не регистрируете его, Unity просто создает для вас ShellPresenter с ShellView в качестве параметра.

10
ответ дан 30 November 2019 в 14:06
поделиться
Другие вопросы по тегам:

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