Это хороший способ справиться с веб-API UriTemplates?


Я хочу быть в состоянии сделать /контакты/Мэтт%20Phillips и /контакты/1 и у обоих из них вернуть контакт. Как я сделал, чтобы попытаться разобрать инт из захваченных параметр и называем идентификатор метода вместо заименем метод вот так:

    [WebGet(UriTemplate="{param}"]
    public Contact SingleParam(string param)
    {
        int x;
        if (int.TryParse(param, out x))
        {
            return GetContactById(x);
        }
        else
        {
            return GetContactByName(param);
        }
    }

    private Contact GetContactByName(string param)
    {
        var contact = from c in contacts
                      where c.Name.Equals(param)
                      select c;
        if (!contact.Any())
        {
            return null;
        }
        return contact.Single();
    }

    public Contact GetContactById(int id)
    {
        var contact = from c in contacts
                      where c.ContactId == id
                      select c;
        if (!contact.Any())
        {
            return null;
        }
        return contact.Single();
    }

Но это кажется неуклюжим для меня. У кого есть предложения по лучший способ, чтобы сделать это?



1004
4
задан 26 июня 2011 в 05:06 Источник Поделиться
Комментарии
2 ответа

Есть более простой способ. Вы можете использовать шаблоны URI, чтобы помочь вам сделать оба метода обработки операций.

[ServiceContract]
public class ContactsApi
{
[WebGet(UriTemplate="{id}")]
public string GetById(int id)
{
//return by id
}

[WebGet(UriTemplate="{first} {last}")]
public string GetByName(string first, string last)
{
//return by name
}
}

Если вы получите о нас /контакты/Мэтт%20Phillips второй метод будет вызван.

3
ответ дан 26 июня 2011 в 08:06 Источник Поделиться

Ваш вопрос уже ответили, но это дополнение к вашему заявлениями LINQ.
Сначала с помощью любого() и тогда один(), вы выполняете две базы данных запросы.
Вы могли бы спасти одного, с помощью метода singleordefault(), такой:

var contact = (from c in contacts
where c.Name.Equals(param)
select c).SingleOrDefault();
return contact;

Еще одно дополнение, если вы выберете не использовать метода singleordefault(), сначала пишите ожидаемых состоянии, за исключением:

if (contact.Any())
{
return contact.Single();
}
return null;

1
ответ дан 28 июня 2011 в 12:06 Источник Поделиться