Моите ASP.NET MVC 2 контролери в момента инстанцират обслужващи обекти в своите конструктори чрез предаване на инстанции на хранилище, които са инстанцирани от Castle Windsor. Имам модулни тестове, които извикват действията на контролера след предаване на Moq екземпляри на хранилищата към конструктора на контролера.
Искам да разреша на потребителски интерфейс на трета страна да осъществява достъп до тези сервизни обекти чрез WCF.
Хрумна ми, че преобразуването на моя съществуващ слой на услугата в уеб услуги или дори добавянето на нов слой на уеб услугата между потребителския интерфейс и съществуващия слой на услугата ще наруши моите модулни тестове, освен ако не намеря начин да преодолея тази празнина.
Опитвах се да намеря решение, при което моят потребителски интерфейс беше кодиран спрямо интерфейс на сервизния слой (той вече е) и можех да използвам DI, за да предам изпълнението на уеб услугата по време на изпълнение и да предам съществуващото изпълнение по време на тестване на единица. Внедряването на уеб услугата просто ще извика съществуващото изпълнение.
Въпроси:
- Препоръчителен/възможен ли е такъв подход?
- Има ли примери за това в урок или проект с отворен код?
РЕДАКТИРАНЕ:
Вярвам, че сега имам работещо решение благодарение на предложенията по-долу. Създадох WCF сервизно приложение, което използва съществуващите сервизни интерфейси от моя модел на домейн. Реализацията на WCF е клас, при който конструкторът взема екземпляри на хранилище от Ninject WCF разширение и създава екземпляр на услугата от модела на домейна. Всеки метод/функция в WCF просто извиква същия метод/функция от съществуващия слой на услугата.
Имаше някои уговорки. Например, вече не мога да предам препратка към моя ASP.NET MVC ModelState, когато създавам услугата в контролера (всъщност използвам Ninject, за да създам екземпляр на услугата WCF и да го доставя на конструктора на контролера). Причината е, че WCF е платформа за съобщения - промените трябва да бъдат изрично съобщени обратно с всяко повикване (т.е. моите грешки при валидиране сега се съобщават обратно като референтни параметри на отделни функции/методи).
Също така трябваше да добавя някои препратки към сериализация/сервизен модел към моя предишен проект POCO Core.
Освен това преминах от Castle към Ninject, защото WCF решението на Castle има ниско ниво на зрялост и не ми беше удобно да го използвам в този момент.