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);
        }
    }
}
Другие вопросы по тегам