Я должен согласиться с Vladimir. Я также изучил использование ОБЪЕДИНЕНИЯ в HQL и не мог найти путь вокруг этого. Нечетная вещь состояла в том, что я мог найти (в Быть в спящем режиме FAQ), что ОБЪЕДИНЕНИЕ не поддерживается, отчеты об ошибках, имеющие отношение к ОБЪЕДИНЕНИЮ, отмеченному 'зафиксированный', группы новостей людей, говорящих, что операторы были бы усеченными в ОБЪЕДИНЕНИИ, и другие группы новостей людей, сообщающих о нем, хорошо работают... После дня унавоживания с ним я закончил тем, что портировал свой HQL назад на простой SQL, но сделать это в Представлении в базе данных будет хороший вариант. В моем случае были динамично сгенерированы части запроса, таким образом, я должен был создать SQL в коде вместо этого.
Я полагаю, вы ищете средство интеграции WCF Castle Windsor. Он предоставляет реализацию ServiceHost, которая берет на себя процесс создания ваших реализаций служб с использованием Windsor IOC. Вы можете внедрять зависимости, как любое другое приложение IoC, используя это средство и, что достаточно удобно, его часть проекта Castle:
http://www.castleproject.org/container/facilities/trunk/wcf/index.html
] Если версия Castle Project не выполняет то, что вам нужно, у меня есть собственный объект, который я создал, чтобы сделать то же самое для Виндзора, прежде чем я нашел версию проекта Castle. Оба они обычно делают одно и то же, но оба подходят к проблеме немного по-разному.
Это хороший вопрос. У меня такая же проблема. Я думаю, что если вы создаете веб-сервисы с использованием файлов .asmx, невозможно использовать внедрение конструктора. Если вместо этого вы использовали WCF для реализации веб-службы, я думаю, что это возможно.
В моей веб-службе .asmx я позволяю контейнеру DI устанавливать зависимости, задавая свойства. Поскольку мое приложение также является приложением asp.net веб-формы, я должен это делать именно так, потому что я также не могу использовать внедрение конструктора в веб-формы. Но я использую StructureMap, и в ней есть функция BuildUp
, которая может устанавливать свойства уже созданного объекта. Не так чисто, как внедрение конструктора, но хороший компромисс.
Но веб-сервисы отличаются от веб-форм, потому что я могу размещать наращивание за пределами веб-формы, в событии Application_PostMapRequestHandler
. Но я не обнаружил события, которое запускается после создания класса веб-службы. Таким образом, в конструкторе моего веб-сервиса у меня есть следующий код
ObjectFactory.BuildUp(this);
И это антипаттерн. Класс, инициализированный контейнером DI, не должен знать о самом контейнере DI. Но лучшего решения я пока не нашел.
Определите базовый класс и используйте в нем внедрение свойств. Пит уже сказал это, но вы бы сделали: ObjectFactory.BuildUp (this);
Разница в том, что я бы поместил его в базовый класс для веб-служб, поэтому он «автоматический» для конкретных реализаций.
Таким образом, это одна строка, поэтому меня бы это не волновало, если у вас нет явной необходимости переключать контейнеры DI во время выполнения (маловероятно). Если тебе это еще нужно,
Какие типы услуг вы создаете? Если вы используете WCF, я написал следующее:
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>();
}
}
У MS есть решение этой проблемы: http://msdn.microsoft.com/en-us/library/ff664461 (PandP.50) .aspx