Как использовать внедрение зависимости и шаблон репозитория с веб-сервисами ASP.NET?

Я должен согласиться с Vladimir. Я также изучил использование ОБЪЕДИНЕНИЯ в HQL и не мог найти путь вокруг этого. Нечетная вещь состояла в том, что я мог найти (в Быть в спящем режиме FAQ), что ОБЪЕДИНЕНИЕ не поддерживается, отчеты об ошибках, имеющие отношение к ОБЪЕДИНЕНИЮ, отмеченному 'зафиксированный', группы новостей людей, говорящих, что операторы были бы усеченными в ОБЪЕДИНЕНИИ, и другие группы новостей людей, сообщающих о нем, хорошо работают... После дня унавоживания с ним я закончил тем, что портировал свой HQL назад на простой SQL, но сделать это в Представлении в базе данных будет хороший вариант. В моем случае были динамично сгенерированы части запроса, таким образом, я должен был создать SQL в коде вместо этого.

7
задан Brandon O'Rourke 29 September 2009 в 15:02
поделиться

6 ответов

Я полагаю, вы ищете средство интеграции WCF Castle Windsor. Он предоставляет реализацию ServiceHost, которая берет на себя процесс создания ваших реализаций служб с использованием Windsor IOC. Вы можете внедрять зависимости, как любое другое приложение IoC, используя это средство и, что достаточно удобно, его часть проекта Castle:

http://www.castleproject.org/container/facilities/trunk/wcf/index.html

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

1
ответ дан 7 December 2019 в 16:44
поделиться

Это хороший вопрос. У меня такая же проблема. Я думаю, что если вы создаете веб-сервисы с использованием файлов .asmx, невозможно использовать внедрение конструктора. Если вместо этого вы использовали WCF для реализации веб-службы, я думаю, что это возможно.

В моей веб-службе .asmx я позволяю контейнеру DI устанавливать зависимости, задавая свойства. Поскольку мое приложение также является приложением asp.net веб-формы, я должен это делать именно так, потому что я также не могу использовать внедрение конструктора в веб-формы. Но я использую StructureMap, и в ней есть функция BuildUp , которая может устанавливать свойства уже созданного объекта. Не так чисто, как внедрение конструктора, но хороший компромисс.

Но веб-сервисы отличаются от веб-форм, потому что я могу размещать наращивание за пределами веб-формы, в событии Application_PostMapRequestHandler . Но я не обнаружил события, которое запускается после создания класса веб-службы. Таким образом, в конструкторе моего веб-сервиса у меня есть следующий код

ObjectFactory.BuildUp(this);

И это антипаттерн. Класс, инициализированный контейнером DI, не должен знать о самом контейнере DI. Но лучшего решения я пока не нашел.

2
ответ дан 7 December 2019 в 16:44
поделиться

Определите базовый класс и используйте в нем внедрение свойств. Пит уже сказал это, но вы бы сделали: ObjectFactory.BuildUp (this);

Разница в том, что я бы поместил его в базовый класс для веб-служб, поэтому он «автоматический» для конкретных реализаций.

Таким образом, это одна строка, поэтому меня бы это не волновало, если у вас нет явной необходимости переключать контейнеры DI во время выполнения (маловероятно). Если тебе это еще нужно,

0
ответ дан 7 December 2019 в 16:44
поделиться

Какие типы услуг вы создаете? Если вы используете WCF, я написал следующее:

http://davidkiff.co.uk/post/2009/08/28/WCF-Inversion-of-Control-e2809cService-Constructore2809d-and-better-Unit-Testing !. aspx

0
ответ дан 7 December 2019 в 16:44
поделиться

Is there any reason you can't create a custom class with the desired constructor, then instantiate an object of that class in your asmx, then delegate all action to that object?

I usually create those kinds of objects like this:

var o = CustomClass.Create();

public class CustomClass
{
  public static CustomClass Create()
  {
    return IoC.Resolve<CustomClass>();
  }
}

public static class IoC
{
  public T Resolve<T>()
  {
    return yourStaticReferenceToPreferredContainer.Resolve<T>();
  }
}
0
ответ дан 7 December 2019 в 16:44
поделиться

У MS есть решение этой проблемы: http://msdn.microsoft.com/en-us/library/ff664461 (PandP.50) .aspx

0
ответ дан 7 December 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: