Unity не соблюдает TransientLifetimeManager? - PullRequest
2 голосов
/ 01 февраля 2011

У меня есть следующий сценарий:

WCF сервисное решение, которое содержит уровень реализации сервиса, бизнес-уровень и уровень данных.Уровень реализации WCF зависит от бизнес-уровня и бизнес-уровня на уровне данных.Каждый слой получает свои зависимости через внедрение конструктора.Мы соединили все это вместе, используя Unity.У нас есть пользовательский WCF хост-сервис / фактор / поведение / экземпляр провайдера, который вызывает наш контейнер Unity для разрешения использования сервиса WCF и его различных зависимостей.

Отлично работает ... почти.

Сначала мы используем код EntityFramework в нашем слое данных.Мы видим, что новый класс DbContext создается при первоначальном вызове в WCF, но этот класс повторно используется при последующих вызовах в службу.Конечно, это становится проблемой, когда наш сервис обслуживает несколько вызовов, которые одновременно обращаются к базе данных.Мне удалось доказать, что класс DbContext фактически используется повторно, поместив несколько операторов trace в конструктор класса DbContext.Я пошел дальше по цепочке и поместил аналогичные операторы трассировки в конструктор реализации бизнес-уровня и обнаружил, что это также вызывается только один раз.Фактически, создается впечатление, что только реализация службы WCF создается для каждого вызова службы, и что уровни данных и бизнес ведут себя как одиночные.

Из того, что я прочитал, это звучит как значение по умолчаниюповедение при использовании RegisterType с Unity заключается в использовании TransientLifetimeManager, и это подразумевает, что новый экземпляр будет создаваться при каждом вызове Resolve.Поскольку не похоже, что это поведение по умолчанию работает правильно, мы попытались явно установить для менеджера времени жизни значение TransientLifetimeManager, однако мы все еще видим, что наш бизнес-уровень и уровень данных ведут себя как одиночные.

Есть идеи о том, что мне нужно сделать, чтобы наши WCF зависимости вели себя как синглтоны?

Обновление: Все еще безуспешно.Я попытался использовать PerResolveLifetimeManager, однако это не решило проблему.В качестве временной работы я реорганизовал свой код так, чтобы он внедрял фабрику в мой уровень данных.Фабрика предоставляет экземпляры DbContext, поэтому я могу гарантировать, что каждый вызов в мой уровень данных использует новый DbContext.Пока это работает нормально, но я бы хотел решить любую проблему, заставляющую Unity удерживать и повторно использовать экземпляры после их создания.

1 Ответ

0 голосов
/ 13 августа 2015

Как мы используем:

  1. Мы регистрируем наш DbContext с помощью HierarchicalLifetimeManager (и других служб).
  2. В экземпляре WCF мы создаем новый дочерний контроллер и разрешаем службу из этого (дочернего) контейнера.
  3. Отметить службу с [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

Итак, магия HierarchicalLifetimeManager дает нам новый экземпляр сервиса и все связанные данные для каждого запроса.

...