2013-06-27 3 views
2

На:Должен ли я хранить свои заводы как свойство на Global_asax?

public class Global_asax : HttpApplication 

У меня есть свойство

public GlobalFactoryManager Factories { get; private set; } 

который я инициализируется в

protected void Application_Start(object sender, EventArgs e) 
     { 
      RegisterRoutes(RouteTable.Routes); 
      this.Factories = new GlobalFactoryManager(); 
     } 

И попытаться позвонить в код, чтобы получить экземпляр некоторого типа:

var staffMember = GlobalContext.Factories().Crm.People.MakeIndividualWithAddedState(); 

Проблема заключается в том, что несколько экземпляров HttpApplication создаются, а вызов метода выше выдает исключение, потому что связанный экземпляр имеет свойство null Factory. то есть приложение Start только получает вызов один раз, поэтому это лотерея о том, какой экземпляр получает Factory! = null.

Должны ли заводы храниться на Global? Они не хранят данные только для создания типов. Если не где?

ответ

2

Application_Start вызывается один раз за время жизни приложения. Метод, который вы ищете, - это Application_Init, который вызывается для каждого экземпляра созданного объекта приложения. Больше информации можно получить у MS documentation (прокрутите вниз до второго абзаца: LifeCycle и Global.asax).

Как указано в документе, в событии Application_Start вы должны создавать только статические свойства, которые затем будут доступны для всех экземпляров.

Учитывая, что ваш завод просто предоставление экземпляров и не имеет проблем, если доступ к нескольким потокам, я заявляю, что, как статическое:

public static GlobalFactoryManager Factories { get; private set; } 

Если иметь экземпляр Фабрики разделяемое всех страниц является а затем введите свою инициализацию в метод Application_Init().

+0

Замечательно и спасибо за ссылку. – rism