1

Раньше мне удалось настроить мое единство, чтобы каждый раз предоставлять новый DataContext моему проекту Репозитория. Он отлично работает.Единство: использование одного и того же файла данных в application_BeginRequest?

Но, например, я использую метод WCF, который открывает 2 службы, которые, в свою очередь, открывают 2 репозитория (шаблон хранилища). Я надеялся, что смогу повторно использовать один и тот же файл данных в одном и том же методе wcf.

Так что я смотрел на RegisterInstance, но я проверяю GetHashCode для datacontext и каждый раз каждый раз. Я думал, что единство будет проверять контейнер для ребенка сначала каждый раз, когда я предполагаю, что у меня есть установка экземпляра - см. ниже

Вот мое единство, которое выполняется один раз!

container.RegisterType<MyDataContext>(new TransientLifetimeManager(), 
     new InjectionConstructor()) 

И тогда я попробовать и настроить в global.asax под Application_BeginRequest - но, возможно, это не идеально, как кажется ввести несколько раз .. даже при запуске службы ФОС, прежде чем кто-то вызывает метод ФОС

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 услуг, которые, в свою очередь, открывают «СВОЕ» Respository котором принимает s в DataContext - MyDataContext

Чтобы устранить проблему с BeginRequest, я мог бы зарегистрировать datacontext в качестве экземпляра (если он работал :-)) для каждого метода WCF, который у меня есть, но он кажется немного длинным.

Конечно, его очень импортировано, что каждое соединение (а не сеансы) получает свой собственный DataContext.

Я удалял datacontext, когда я удалял свой репозиторий ... теперь (если я могу заставить его работать), я полагаю, что мне нужно будет избавиться от этого в EndRequest .. в противном случае, если одна служба завершает и удаляет DataContext и другая служба не финишировали, тогда я собираюсь получить проблемы.

Я надеюсь, что я объяснил это хорошо, :-)

Резюме в том, что каждый метод WCF должен использовать свой собственный DataContext, метод Интернет может назвать более чем на 1 услугу (репозиторий шаблон), который в свою очередь, будем называть его репозиторий, который ожидает, что datacontext на constuctor, который объединяет регистры, - но в настоящее время, когда в одном и том же методе WCF несколько служб вызывают там репозитории, и они получают там собственный DataContext.

Если я могу уточнить что-нибудь, пожалуйста, дайте мне знать

Благодаря

EDIT

Забыла упомянуть, как я получаю единство разрешить вещи ...Я просто называю это на контейнер (не ребенок контейнер) на сервис, который в своей очереди вызывает respository

using (IOfficeService officeService = Bootstrapper.Container.Resolve<IOfficeService >()) 
     { 

ответ

3

Вы регистрируете экземпляр в детском контейнере, так что вы должны использовать дочерний контейнер при решении вашей службы (Кроме того, вы должны быть утилизацией детского контейнера на 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); 
     } 
    } 
} 
+0

Спасибо Майкла но «PerRequestLifetimeManager» собирается дать то же DataContext всего - то есть на каждый запрос, который приходит? Значит, разные клиенты, вызывающие разные методы wcf, получат один и тот же DataContext? –

+0

Это означает, что в запросе будет возвращен тот же экземпляр. По сути, каждый запрос будет иметь собственный синглтон. Различные клиенты не будут использовать один и тот же экземпляр. –

+0

Отлично, я сначала царапал себе голову, так как я не мог найти perRequestLifeTimeManager .. но мне удалось найти его в сети ... он отлично работает .. спасибо. –

Смежные вопросы