Unity: использовать тот же текст данных в application_BeginRequest?
Ранее мне удалось настроить мое единство, чтобы каждый раз предоставлять новый DataContext для моего проекта репозитория. Работает отлично.
Но, например, я нахожусь в методе WCF, который открывает 2 службы, которые, в свою очередь, открывают 2 репозитория (шаблон репозитория). Я надеялся, что смогу повторно использовать один и тот же текст данных в том же методе wcf.
Итак, я смотрю на RegisterInstance, но я проверяю GetHashCode для datacontext и каждый раз отличается. я думал, что Unity будет проверять дочерний контейнер каждый раз, когда я предполагаю, что у меня есть установка экземпляра - см. ниже
Вот мое единство, которое исполняется один раз!
container.RegisterType<MyDataContext>(new TransientLifetimeManager(),
new InjectionConstructor())
А потом я пытаюсь настроить в global.asax в Application_BeginRequest - но, возможно, это не идеально, так как, кажется, вводится несколько раз... даже при запуске службы wcf до того, как кто-то вызовет метод wcf
protected void Application_BeginRequest(object sender, EventArgs e)
{
Bootstrapper.ConfigureDataContextContainer();
}
И вот мой configureDataContextContainer
public static void ConfigureDataContextContainer()
{
if (childContainer == null) // I have to do this otherwise it executes multiple times.
{
childContainer = Bootstrapper.Container.CreateChildContainer();
childContainer.RegisterInstance<MyDataContext>
(container.Resolve<MyDataContext>()); // I Presume i create an instance here
}
}
Как я уже сказал в своем методе WCF, я открываю 2 службы, которые, в свою очередь, открывают репозиторий "ИХ СОБСТВЕННЫЙ", который принимает DataContext - MyDataContext
Чтобы исправить проблему с BeginRequest, я мог бы зарегистрировать текст данных в качестве экземпляра (если он работал:-)) для каждого метода WCF, который у меня есть, но кажется, что это далеко.
Конечно, очень важно, что каждое соединение (не сессии) получает свой собственный DataContext.
Я избавлялся от контекста данных, когда, когда я удалил свой репозиторий... сейчас (если я могу заставить его работать), я предполагаю, что мне нужно будет избавиться от этого в EndRequest... в противном случае, если один сервис завершает и удаляет DataContext, а другой - сервис еще не закончен, тогда у меня будут проблемы.
Я надеюсь, что я объяснил это хорошо,:-)
Суть в том, что каждый метод WCF должен использовать свой собственный текст данных, веб-метод может вызвать более 1 службы (шаблон репозитория), которая, в свою очередь, вызовет свой репозиторий, который ожидает текст данных в конструкторе, который регистрирует единица - но в настоящее время, когда он находится в том же WCF метод, несколько сервисов вызывают там репозитории и получают собственный DataContext.
Если я могу что-то уточнить, пожалуйста, дайте мне знать
Спасибо
РЕДАКТИРОВАТЬ
Забыл упомянуть, как я получаю единство для решения проблем... Я просто вызываю это в контейнере (не дочернем контейнере) для службы, которая, в свою очередь, вызывает хранилище
using (IOfficeService officeService = Bootstrapper.Container.Resolve<IOfficeService >())
{
1 ответ
Вы регистрируете экземпляр в дочернем контейнере, поэтому вы должны использовать дочерний контейнер при разрешении вашего сервиса (также вы должны избавиться от своего дочернего контейнера в Application_EndRequest):
using (var service = childContainer.Resolve<IOfficeService >())
{
}
Однако, используя PerRequestLifetimeManager
следует выполнить то же самое:
Container.RegisterType<MyDataContext>(new PerRequestLifetimeManager());
Вот как я это реализую:
public class PerRequestLifetimeManager : LifetimeManager {
private Guid key;
public PerRequestLifetimeManager() {
key = Guid.NewGuid();
}
public override object GetValue() {
if (HttpContext.Current == null) {
return null;
} else {
return HttpContext.Current.Items[key];
}
}
public override void RemoveValue() {
if (HttpContext.Current != null) {
HttpContext.Current.Items.Remove(key);
}
}
public override void SetValue(object newValue) {
if (HttpContext.Current != null) {
HttpContext.Current.Items.Add(key, newValue);
}
}
}