Можно ли использовать один сервис generic/abstract в ServiceStack?

Я разрабатываю (надеюсь) RESTful API, используя ServiceStack.

Я заметил, что большинство моих сервисов выглядят одинаково, например, метод GET будет выглядеть что-то следующим образом:

        try
        {
            Validate();
            GetData(); 
            return Response();
        }
        catch (Exception)
        {
            //TODO: Log the exception
            throw; //rethrow
        }

скажем, я получил 20 ресурсов, 20 запросил DTO, поэтому я получил около 20 сервисов одного и того же шаблона более или менее ...

Я попытался создать общую или абстрактную службу, чтобы создавать сервисы наследования, которые только реализуют соответствующее поведение, но я застрял, потому что запросы DTO не были необходимы для сериализации.

Есть ли способ сделать это?

<�Сильный> EDIT:

Пример того, что я пытаюсь сделать:

public abstract class MyService<tresponse,TRequest> : Service
{
    protected abstract TResponse InnerGet();
    protected abstract void InnerDelete();
    public TResponse Get(TRequest request)
    {
        //General Code Here.
        TResponse response = InnerGet();
        //General Code Here.
        return response;
    }

    public void Delete(TRequest request)
    {
        //General Code Here.
        InnerDelete();
        //General Code Here.
    }
}

public class AccountService : MyService
{

    protected override Accounts InnerGet()
    {
        throw new NotImplementedException();//Get the data from BL
    }

    protected override void InnerDelete()
    {
        throw new NotImplementedException();
    }
}
4
nl ja de

1 ответы

Чтобы сделать это в новом API , мы внедрили концепцию IServiceRunner, которая отделяет выполнение вашего сервиса от его реализации.

Чтобы добавить свои собственные служебные крюки, вам просто нужно переопределить стандартную службу Runner в AppHost из ее реализации по умолчанию:

public virtual IServiceRunner<trequest> CreateServiceRunner<trequest>(ActionContext actionContext)
{           
    return new ServiceRunner<trequest>(this, actionContext); //Cached per Service Action
}

С вашим собственным:

public override IServiceRunner<trequest> CreateServiceRunner<trequest>(ActionContext actionContext)
{           
    return new MyServiceRunner<trequest>(this, actionContext); //Cached per Service Action
}

Где MyServiceRunner - это просто пользовательский класс, реализующий пользовательские крючки, которые вас интересуют, например:

public class MyServiceRunner : ServiceRunner {
    public override void OnBeforeExecute(IRequestContext requestContext, TRequest request) {
     //Called just before any Action is executed
    }

    public override object OnAfterExecute(IRequestContext requestContext, object response) {
     //Called just after any Action is executed, you can modify the response returned here as well
    }

    public override object HandleException(IRequestContext requestContext, TRequest request, Exception ex) {
     //Called whenever an exception is thrown in your Services Action
    }
}

Кроме того, для более мелкомасштабных параметров обработки ошибок просмотрите страницу wiki для обработки ошибок .

4
добавлено
Перейдите на страницу github.com/ServiceStack/ServiceStack/wiki/Error-Handling . за то, как в целом обрабатывать все исключения. Старый API (т. Е. ServiceBase ) позволяет наследовать, но мы отделили это от нового API, используя вышеперечисленные крючки IServiceRunner.
добавлено автор mythz, источник
Нет, вы не можете абстрагировать точки входа вашего сервиса в базовый базовый класс. Зарегистрируйте собственный ServiceRunner , как описано выше, если вы хотите добавить свои собственные пользовательские перехватчики. В противном случае добавьте пользовательскую логику с помощью фильтра Request/Response и посмотрите вики-страницу с ошибкой с тем, как в целом обрабатывать ошибки. В вики-странице порядка операций отображаются все доступные пользовательские крючки.
добавлено автор mythz, источник
Я не уверен, как я могу использовать это для того, что я имел в виду ... Я использовал его для регистрации исключений в одном месте, но здесь я хочу создать службу шаблонов, так что мне не нужно создавать несколько классов обслуживания
добавлено автор Mithir, источник
или я могу наследовать эту услугу, в которой уже будут реализованы методы Get, Post и т. д., и в этих классах служб мне нужно будет только реализовать получение данных и их сборку и т. д.
добавлено автор Mithir, источник
Я отредактировал свой вопрос с примера того, что я хочу сделать (более или менее). это можно сделать с помощью крючков или каким-либо другим способом?
добавлено автор Mithir, источник
мои намерения теперь яснее? моя цель в редактировании возможна?
добавлено автор Mithir, источник