Веб-сервисы и статические методы - PullRequest
0 голосов
/ 30 марта 2011

Я использую веб-службы ASP.NET, такие как:

[WebMethod]
public void DeleteColumn(long columnId)
{
    Column.DeleteColumn(columnId);
}

Проблема в том, что для программирования sudh требуется много статических методов.
Например, если я хотел бы делать что-то без статических методовЯ должен был бы сделать что-то вроде этого:

[WebMethod]
public void DeleteColumn(Column c)
{
    c.DeleteColumn();
}

На мой взгляд, у этой реализации есть две проблемы:

  1. Мне нужно создать пустой конструктор для класса Column.
  2. Я должен передать от клиента весь объект вместо одного параметра.Во время использования этого веб-сервиса я не могу знать, каких членов клиент должен заполнить, чтобы выполнить метод (в этом случае удалить).

Я считаю, что споследний подход, который я написал, но я также знаю, что статические методы не являются лучшими для объектно-ориентированного программирования.
Что вы думаете?как мне реализовать веб-сервисы?
Есть ли место для шаблонов проектирования для таких задач или для веб-разработчиков?

Ответы [ 2 ]

4 голосов
/ 30 марта 2011

Почему бы не инициализировать ваш Column объект с идентификатора, который вы передаете?

[WebMethod]
public void DeleteColumn(long columnId)
{
    Column c = new Column(columnId);
    c.DeleteColumn();
}

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

[WebMethod]
public void DeleteColumn(long columnId)
{
    IColumn c = ColumnFactory.CreateColumn(columnId);
    c.DeleteColumn();   // Could be any object that implements IColumn
}
2 голосов
/ 30 марта 2011

Вместо этого вы должны использовать внедрение зависимостей.В большинстве DI-фреймворков есть плагины, благодаря которым вы можете просто изменить файл .svc, указав фабрику хоста.Тогда ваш код может выглядеть примерно так:

private IColumnRepository _columnRepository;
public MyWebService(IColumnRepository columnRepository)
{
    _columnRepository = columnRepository;
}
[WebMethod]
public void DeleteColumn(long columnId)
{
    _columnRepository.DeleteColumn(columnId);
}

Редактировать

Извините, я не осознавал, что это ASMX.Если у вас есть возможность, вы должны переключиться на WCF.Согласно MSDN :

Эта тема относится к устаревшей технологии.Веб-службы XML и клиенты веб-служб XML теперь должны создаваться с использованием Windows Communication Foundation (WCF).

Но даже если вы застряли в ASMX, Dependency Injection является жизнеспособным вариантом.Например, используя Ninject, вы можете сделать что-то вроде этого:

[Inject]
public IColumnRepository ColumnRepository {get;set;}
public MyWebService()
{
    Injection.Kernel.Inject(this);
}
[WebMethod]
public void DeleteColumn(long columnId)
{
    _columnRepository.DeleteColumn(columnId);
}

Это немного теснее связывает вас с ядром внедрения, но вы все равно получаете многие преимущества внедрения зависимости.

...