Мои контроллеры ASP.NET MVC 2 в настоящее время создают экземпляры сервисных объектов в своих конструкторах, передавая экземпляры репозитория, которые создаются Castle Windsor. У меня есть модульные тесты, которые вызывают действия контроллера после передачи экземпляров Moq репозиториев в конструктор контроллера.
Я хочу разрешить стороннему пользовательскому интерфейсу получать доступ к этим объектам службы через WCF.
Мне пришло в голову, что преобразование моего существующего сервисного уровня в веб-сервисы или даже добавление нового уровня веб-сервисов между пользовательским интерфейсом и существующим сервисным слоем нарушит мои модульные тесты, если я не найду способ преодолеть этот разрыв.
Я пытался найти решение, в котором мой пользовательский интерфейс был закодирован для интерфейса уровня обслуживания (он уже есть), и я мог бы использовать DI для передачи реализации веб-службы во время выполнения и передачи существующей реализации во время модуля. тестирование. Внедрение Web-сервиса просто вызвало бы существующую реализацию.
Вопросы:
- Является ли такой подход целесообразным / возможным?
- Есть ли примеры в учебном проекте или проекте с открытым исходным кодом?
EDIT:
Я полагаю, что теперь у меня есть работоспособное решение благодаря предложениям ниже. Я создал приложение службы WCF, которое использует существующие интерфейсы служб из моей модели домена. Реализация WCF - это класс, в котором конструктор берет экземпляры репозитория из Ninject расширение WCF и создает экземпляр службы из модели домена. Каждый метод / функция в WCF просто вызывает один и тот же метод / функцию из существующего уровня обслуживания.
Были некоторые предостережения. Например, я больше не могу передавать ссылку на мой ASP.NET MVC ModelState при создании службы в контроллере (на самом деле я использую Ninject, чтобы создать экземпляр службы WCF и передать его конструктору контроллера). Причина в том, что WCF является платформой обмена сообщениями - об изменениях необходимо явно сообщать обратно при каждом вызове (т. Е. Мои ошибки проверки теперь передаются обратно в качестве ссылочных параметров для отдельных функций / методов).
Мне также пришлось добавить некоторые ссылки на сериализацию / сервисную модель для моего бывшего проекта POCO Core.
Кроме того, я переключился с Касла на Ninject, потому что Решение WCF Касла имеет низкий уровень зрелости, и мне было неудобно использовать его в это время.