Инкапсуляция ссылки на сервис - PullRequest
2 голосов
/ 16 мая 2011

Я создаю набор консольных приложений, которые все должны ссылаться на веб-сервис.У меня есть библиотека классов, которая содержит большую часть общей функциональности этих приложений, включая веб-службу (которая была добавлена ​​в качестве ссылки на службу).Я знаю, что «правильный» способ справиться с этим - скопировать блок из app.config библиотеки классов в каждое консольное приложение, но это вызывает головную боль при обслуживании.Я также нашел альтернативу использованию общего файла app.config со ссылкой на него в конфигурации каждого приложения.Это лучше, но все же не очень хорошо - это все еще включает ручную настройку каждого нового приложения и требует, чтобы я был уверен, что общий конфигурационный файл находится в месте, к которому могут обращаться все приложения.это одна из трех вещей (в порядке убывания удовлетворенности):

  1. Способ инкапсуляции всего сервиса и всего необходимого для его доступа в dll, который создается из библиотеки классов.
  2. Способ автоматического копирования соответствующей информации конфигурации в каталог сборки каждого консольного приложения (например, сценарий после сборки).
  3. Объяснение того, почему ни один из предыдущих двух выполним.(В таком случае я пойду с общим конфигом)

Любой совет?

Ответы [ 2 ]

3 голосов
/ 16 мая 2011

Честность 2 тривиальна.Вы можете легко скопировать файл конфигурации в каталог сборки.Простой поиск в Google может дать вам все, что вам нужно.

Для части 1 у вас есть варианты, я бы предложил просто определить API для вашего сервиса в форме интерфейса.Затем с помощью DI подключить «реализацию» через DLL.Это делается постоянно с использованием Adapter Pattern , а затем с использованием чего-то вроде Unity для реализации во время выполнения.

PSEUDO:

interface IMyServiceAdaptor {
   void SomeMethod(params );
   void SomeMethod2(params );
}

public class ServiceAdaptor : IMyServiceAdaptor{
    #psudo code
    ServiceProxyClient client  { get;set;}

    public void SomeMethod(parms){
       var convertedParams = Convert(parms);
       return client.SomeMethod(convertedParams );
   }
   ...etc

}

public class MyClient {
  [Dependancy]
  IMyServiceAgent agent { get;set;}

  public MyClient(){
     #resolve
 }

}


Концепция проста.У вас есть внутреннее представление вашего сервиса (IMyServiceAdaptor).Важно, чтобы он полностью не зависел от базовых прокси-вызовов (сервисных ссылок), которые фактически вызывают ваш сервис.Идея в том, что вы создаете дружественный интерфейс для своего сервиса и взаимодействуете с ним.Вы всегда адаптируете сервис под API вашего интерфейса приложений.Это защитит вас от изменений на стороне службы, предоставит интерфейс, который вы можете использовать для внедрения, а также позволит вам вставить дополнительную логику для решения проблем.

1 голос
/ 26 мая 2011

Потратив некоторое время на работу над другими вещами, я вернулся к этой проблеме и обнаружил связанный с этим вопрос над здесь . Ответ Тронда на этот вопрос работал для меня очень хорошо и был намного проще, чем что-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...