Есть ли способ реализовать основной шаблон кода в WCF? - PullRequest
2 голосов
/ 11 февраля 2010

Я работаю над проектом веб-сервисов на основе WCF. У нас около 50 различных сервисов, которые предоставляют операции получения, создания, обновления и удаления. Моя проблема в том, что когда я нахожу ошибку в операции, скажем, в операции get, которая является общей для всех сервисов, мне нужно открыть и заменить весь код во всех 50 сервисах. У меня вопрос, есть ли способ реализовать один шаблон кода ядра, чтобы любое внесенное мной изменение использовалось всеми службами? В основном я ищу что-то похожее на концепцию главной страницы в ASP.NET. Позвольте мне привести один воображаемый пример, чтобы лучше проиллюстрировать мой вопрос;

public string Get(Parameter param)
{
    ArrayList myList = new ArrayList();
    //some service specific business rules implemented here
    return myList.ToString();
}

Предположим, что приведенный выше код используется всеми службами, и я хочу изменить свой объект ArrayList на объект List, например:

public string Get(Parameter param)
{
    List<string> myList = new List<string>();
    //some service specific business rules implemented here
    return myList.ToString();
}

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

Ответы [ 4 ]

1 голос
/ 11 февраля 2010

Вы действительно должны извлечь внутреннюю логику каждого веб-сервиса в универсальный компонент многократного использования и без зависимостей и оставить операцию веб-сервиса в качестве заглушки, которая просто вызывает эту логику, например:

//Convert:
public string Get(Parameter param)
{
    List<string> myList = new List<string>();
    //some service specific business rules implemented here
    return myList.ToString();
}

//Into:
public string Get(Parameter param)
{
    var serviceFor = new ModelService<MyModel>();
    return serviceFor.ExecuteGet(param);
}
0 голосов
/ 12 февраля 2010

Обычно я использую реализацию Services как очень тонкий слой, только для классов контроллеров. Я едва помещаю логику в сам класс, если могу избежать этого. Это похоже на ваш пример. Убедитесь, что ваша реализация сервиса контролирует только основной поток вашей сервисной логики и использует «рабочие» классы для выполнения самой логики. Таким образом, вы можете повторно использовать / делиться логикой при необходимости. Это также помогает коду быть более читабельным.

Надеюсь, это поможет.

0 голосов
/ 11 февраля 2010

У нас есть сервисы WCF и код веб-сервисов asmx, которые помещают весь код реализации в класс, а затем каждый сервис устанавливает этот класс и вызывает нужный нам метод:

private ServiceImplementation _implementation = new ServiceImplementation();

public string Get(Parameter param)
{
    List<string> myList = new List<string>();
    //some service specific business rules implemented here
    return implementation.Get(param);
}

Таким образом, весь наш код реализации находится в одном месте.

0 голосов
/ 11 февраля 2010

Трудно сказать без каких-либо дополнительных примеров, но не могли бы вы перенести общие части в абстрактный класс? Например:

interface IMyService
{
    string Get(Parameter param); // common stuff
    void GetInternal(Parameter param); // implementation specific stuff
}

abstract class MyServiceBase : IMyService
{
    public string Get(Parameter param)
    {
        List<string> myList = new List<string>();
        GetInternal(param); // do service specific stuff
        return myList.ToString();
    }
}

class MyService1 : MyServiceBase
{
    public GetInternal(Parameter param)
    {
        // service specific stuff
    }
}

Вариант 2:

Не могли бы вы использовать шаблон T4 или что-то еще для генерации кода bilerplate для каждого сервиса?

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