Экземпляр регистра единицы и твердость

Я записал класс, который имеет некоторые зависимости, которые он разрешает от контейнера единицы.

От моего основного класса я создаю новый объект

MyObject myObject = new MyObject();

Я регистрирую его в своем Контейнере Единицы

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager());

я создает тип, которому нужно это как зависимость

ConsumerObject consumer = new ConsumerObject();

потребитель похож на это:

public class ConsumerObject
{
    public ConsumberObject()
    {
         theObject = (MyObject)UContainer.Resolve(typeof(MyObject));    
    }
}

это выдает исключение:

Разрешение зависимости перестало работать, введите = "MyObject", имя = "". Сообщение об исключении: текущая операция сборки (создают ключевой Ключ Сборки [MyObject, пустой указатель]), неудавшийся: стр параметра не могли быть разрешены при попытке назвать конструктора MyObject (стр IPreferenceStorageProvider). (Тип стратегии BuildPlanStrategy, индекс 3)

Почему мой вызов твердости пытается назвать другой contsructor на типе? Я уже создал его и зарегистрировал экземпляр.. Я также попробовал его как: theObject = UContainer.Resolve<MyObject>(); кажется, не имеет значения..

Спасибо

7
задан abatishchev 26 May 2013 в 18:25
поделиться

2 ответа

Я не вижу ничего плохого в этом подходе. Этот метод можно найти под разными именами в целом ряде рамок, например StartMessenger в Zend Framework . Обычно сеанс переносится в объект вместо обычного массива сеанса и с помощью ViewHelper вместо функции.

Чтобы убедиться в отсутствии опечаток в клавишах сеанса при назначении сообщения, можно также преобразовать код назначения в функцию, например,

function set_message($text, $type)
{
    $_SESSION['message'] = array(
        'text' => $text,
        'type' => $type
    );
}

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

return sprintf('<div id="message-box" class="type-%s">%s</div>',
                $_SESSION["message"]["text"], 
                $_SESSION["message"]["type"]);

Как отметил @ Gumbo, функция может не работать, когда Сеансы не работают, но это, вероятно, наложит ряд других проблем для всего приложения тогда, так что я бы точно не беспокоился об этой конкретной части кода тогда.

Незначительная вещь: $ _ SESSION является сверхглобальным , поэтому не нужно использовать ключевое слово global .

-121--5044484-

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

-121--3713271-

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

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

1
ответ дан 6 December 2019 в 14:04
поделиться

Я не уверен, почему вы видите свое поведение. Я только что создал тест, который дублировал ваш сценарий, и он отлично сработал.

Вы пробовали что-то подобное

public class ConsumerObject
{
    public ConsumberObject(MyObject myObject)
    {
         theObject = myObject
    }
}

и затем использовали UContainer.Resolve() ?

Единственное, о чем я могу подумать, это когда вы получаете доступ к UContainer.RegisterInstance, а затем UContainer.Resolve, вы на самом деле получаете доступ к двум разным контейнерам. Не могли бы вы показать нам, как вы декларируете UContainer?

.
3
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

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