C# Кастомный роутинг в WebApi

275
31 марта 2017, 22:03

Здравствуйте,как сделать роутинг с параметром типа T (class)?

public class DocumentController : DbAccessController
{
    [RoutePrefix("T/values")] //Where T - document name/tableEntityClass
    [HttpGet]
    public IHttpActionResult GetItem(Guid id)
    {
        return this.Ok(this._documentQueries.GetItem<T>(id));
    }
}
Answer 1

Можно создать отдельный контроллер на каждый допустимый параметр:

class DocumentControllerBase<T> : DbAccessController {
    [Route("values")]
    [HttpGet]
    public IHttpActionResult GetItem(Guid id)
    {
        return this.Ok(this._documentQueries.GetItem<T>(id));
    }
}
[RoutePrefix("Foo")]
class FooDocumentController : DocumentControllerBase<Foo> {}

А можно и строкой принимать имя типа и превращать его в конкретную реализацию обобщенных методов через словарь и промежуточный слой абстракции:

interface IDocumentType {
    object GetItem(IDocumentQueries q, Guid id);
}
class DocumentType<T> : IDocumentType {
    public object GetItem(IDocumentQueries q, Guid id) {
       return q.GetItem<T>(id);
    }
}
class DocumentController : DbAccessController 
{
    private static Dictionary<string, IDocumentType> types = new Dictionary<string, IDocumentType>() {
      { "Foo", new DocumentType<Foo>() },
    };
    [Route("{T}/values")]
    public IHttpActionResult GetItem(string T, Guid id)
    {
        return this.Ok(types[T].GetItem(this._documentQueries, id));
    }
}

Ну и обычный switch точно никто не отменял.

READ ALSO
Не удается загрузить один или более запрошенных типов. Обратитесь к свойству LoaderExceptions

Не удается загрузить один или более запрошенных типов. Обратитесь к свойству LoaderExceptions

Всем доброго времени сутокПишу плагин(dll) для запуска в планировщике задач

511
Отправка COM-порт ASCII команд

Отправка COM-порт ASCII команд

Задача в опросе весов CAS AP через RS 232 или СОМ порт

501
сохранение jpg в наилучшем качестве C#

сохранение jpg в наилучшем качестве C#

Добрый деньИмеется код, объединяющий два изображения в одно:

286