2016-02-03 2 views
1

Если у меня есть класс HelperClass, который я хотел бы использовать в саге, я хотел бы иметь возможность вставить IHelperClass в конструктор.Как выполнить инъекцию конструктора с помощью саги NServiceBus?

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

Я думаю, что я мог бы использовать вложение свойств, но поскольку этот вспомогательный класс «необходим», я понимаю, что инъекция свойств (при условии, что это сработает) не является лучшей практикой.

Как я могу это сделать, не принимая жесткой зависимости от конкретной реализации HelperClass?

+0

Не уверен, что это помогает, но здесь идет. То, что я делал на Java (с использованием обработки байт-кода во время выполнения), состояло в том, чтобы переименовать конструктор no-arg и изменить его сигнатуру метода, чтобы включить дополнительный параметр (ваш IHelperClass), и ввести некоторый код для его использования. Затем я добавляю новый конструктор no-arg в качестве прокси для переименованного конструктора и вставляю код с помощью фабрики, чтобы получить экземпляр «IHelperClass». Таким образом, код, который не знает о дополнительном параметре, все равно будет работать нормально. Что-то вроде этого возможно? – Kenney

+0

Я все еще приступаю к скорости использования чего-то другого, кроме DIY бедного человека, поэтому мне может быть что-то упущено, но это вообще кажется возможным. Я думаю, что единственное, что я должен был иметь, чтобы мой класс, который я пытаюсь ввести «в», имеет зависимость от моего контейнера IoC. – ksigmund

+0

Думаю, я ошибся с этим, извините. Вы тот, кто реализует конструкторы 'Saga', верно? Тогда нет необходимости в манипулировании байтами времени выполнения. В DI «необходимость» класса-помощника представлена ​​зависимостью от компонента, являющейся аннотированным полем, вместо параметра конструктора (для которого нужна не-нулевая проверка!). * Вложение свойств * - это то же самое, что и параметры конструктора. За исключением того, что вы явно не указываете свои значения в своем коде, но у вас есть движок DI, сделайте это для вас - как бы инвертируйте управление: IoC. – Kenney

ответ

2

Вам не нужно беспокоиться о «необходимости» объекта справки в контексте саги, поскольку никакой другой код не будет непосредственно создавать сагу.

Одним словом, вы можете использовать вложение свойств без проблем здесь.

+0

Спасибо, Udi! Один из оставшихся вопросов для меня заключается в том, что использование инжекции свойств не потребует, чтобы я помню, чтобы указать реализацию интерфейса во время модульного тестирования? Мое предположение заключается в том, что если я этого не сделаю, тест завершится неудачно, так как это свойство будет равно нулю. Или есть способ использовать мой контейнер IoC для этого? – ksigmund

+0

Это правильно. –

Смежные вопросы