我应该将我的工厂作为属性存储在Global_asax上吗?

时间:2013-06-27 08:24:04

标签: c# asp.net global-variables

在:

 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属性。即应用程序启动只被调用一次所以它是一个抽奖,关于哪个实例获得工厂!= null。

工厂应该存储在Global吗?他们不是仅仅创建类型的数据。如果不在哪里?

1 个答案:

答案 0 :(得分:2)

每个应用程序的生命周期都会调用Application_Start一次。您要查找的方法是Application_Init,它将为创建的每个Application对象实例调用。更多信息可从MS documentation获得(向下滚动到第二段:LifeCycle和Global.asax)。

正如文档所指定的那样,在Application_Start事件中,您应该只实例化静态属性,然后静态属性将可用于所有实例。

鉴于您的工厂只是提供实例,并且如果多个线程访问它没有问题,我会将其声明为静态:

public static GlobalFactoryManager Factories { get; private set; }

如果您的所有网页共享工厂实例是个问题,那么请将初始化放入Application_Init()方法。