2016-01-02 5 views
1

/v1/Tenants/{TenantId} Маршрут работает, но /v1/Tenants/{TenantName} Маршрут не работает, не уверен, что не так? Кроме того, это правильный способ разработки или применения критериев фильтра?Борьба для настройки нескольких маршрутов

//Request DTO 
[Route("/v1/Tenants/{TenantName}", "GET")] 
public class TenantRequestByTenantName: IReturn<TenantResponse> 
{ 
    public string TenantName { get; set; } 
} 

//Request DTO 
[Route("/v1/Tenants/{TenantId}", "GET")] 
public class TenantRequestById : IReturn<TenantResponse> 
{ 
    public int? TenantId { get; set; } 
} 

//Response DTO 
public class TenantResponse 
{ 
    public ITenantEntity Result { get; set; } 
    public ResponseStatus ResponseStatus { get; set; } 
} 

public class RestaurantService : Service 
{ 
    public object Any(TenantRequestById request) 
    { 
     return this.GetTenant(request); 
    } 

    public object Any(TenantRequestByTenantName request) 
    { 
     return this.GetTenant(request); 
    } 

    private object GetTenant(object whereConditions) 
    { 
     return new TenantResponse 
     { 
      Result = new TenantManager().GetRow(whereConditions) 
     }; 
    } 
} 

ответ

2

Маршруты неоднозначные оба маршрута обрабатывать один и тот же маршрут, то есть:

/v1/Tenants/xxx 

Вы либо должны иметь отдельные маршруты, например:

[Route("/v1/tenants/{TenantId}")] 
public class TenantRequestById { ... } 

[Route("/v1/tenants/by-name/{TenantName}")] 
public class TenantRequestByTenantName { ... } 

Или вы могли бы иметь единый сервис, который обрабатывает оба запроса в зависимости от того, является ли оно целым или нет. as done in TechStacks:

[Route("/technology/{Slug}")] 
public class GetTechnology : IReturn<GetTechnologyResponse> 
{ 
    public string Slug { get; set; } 

    public long Id 
    { 
     set { this.Slug = value.ToString(); } 
    } 
} 

Перегрузка Id позволяет вашим типизированных клиентам иметь идеальный API, например:

var response = client.Get(GetTechnology { Id = 1 }); 

var response = client.Get(GetTechnology { Slug = "servicestack" }); 

Затем в реализации сервиса вы можете проверить, является ли Slug является целым числом Id или не выбрать соответствующий запрос, например:

public object Get(GetTechnology request) 
{ 
    int id; 
    var tech = int.TryParse(request.Slug, out id) 
     ? Db.SingleById<Technology>(id) 
     : Db.Single<Technology>(x => x.Slug == request.Slug.ToLower()); 

    return new GetTechnologyResponse { 
     Result = tech, 
    }; 
} 
+1

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