我有一些数据层类,几乎在整个站点上都非常频繁地使用。
我以前在一个 Windows 应用程序上工作,我曾经在模块(vb.net)中创建它的对象,但现在我在 C# 和 ASP.NET 上工作。
现在我需要做同样的事情,这样我就不需要在每个页面上多次创建相同的对象。
我想使用类似使用全局变量的东西。
我怎样才能做到这一点?
是通过使用 global.asax 完成的吗?
我可以在 global.asax 中创建我的对象吗
我是 asp.net 的新手,所以试着给出语法和解释。
我有一些数据层类,几乎在整个站点上都非常频繁地使用。
我以前在一个 Windows 应用程序上工作,我曾经在模块(vb.net)中创建它的对象,但现在我在 C# 和 ASP.NET 上工作。
现在我需要做同样的事情,这样我就不需要在每个页面上多次创建相同的对象。
我想使用类似使用全局变量的东西。
我怎样才能做到这一点?
是通过使用 global.asax 完成的吗?
我可以在 global.asax 中创建我的对象吗
我是 asp.net 的新手,所以试着给出语法和解释。
您实际上不需要使用 global.asax。您可以创建一个将您的对象公开为static
s 的类。这可能是最简单的方法
public static class GlobalVariables {
public static int GlobalCounter { get; set; }
}
您还可以使用应用程序状态甚至ASP.NET 缓存,因为它们在所有会话中共享。
但是,如果我在这种情况下,我会使用像Spring.NET这样的框架来管理我所有的 Sington 实例。
这是一个快速示例,说明如何使用 Spring.NET 获取类实例
//The context object holds references to all of your objects
//You can wrap this up in a helper method
IApplicationContext ctx = ContextRegistry.GetContext();
//Get a global object from the context. The context knows about "MyGlobal"
//through a configuration file
var global = (MyClass)ctx.GetObject("MyGloblal");
//in a different page you can access the instance the same way
//as long as you have specified Singleton in your configuration
但实际上,这里更大的问题是为什么需要使用全局变量?我猜你并不真的需要它们,可能有一个更好的大局解决方案适合你。
我建议您为此目的使用应用程序状态。
我将跳过关于在 .NET 中使用全局变量的“应该”部分,并展示一些我现在正在使用的代码,这些代码将Global.asax用于一些“全局”变量。以下是该文件中的一些信息:
public class Global : System.Web.HttpApplication
{
public enum InvestigationRole
{
Complainent,
Respondent,
Witness,
}
public static string Dog = "Boston Terrier";
}
因此,从 ASPX 页面中,您可以通过打开静态 Global 类来访问这些成员,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
string theDog = Global.Dog;
// copies "Boston Terrier" into the new string.
Global.InvestigationRole thisRole = Global.InvestigationRole.Witness;
// new instance of this enum.
}
不过买家要小心。在 .NET 世界中有更好的方法来处理“全局变量”的概念,但上述方法至少可以让您在所有 ASPX 页面中重复相同的字符串之上获得一层抽象。
“ ASP.NET 应用程序状态概述”包含一个可用于跨所有用户存储数据的对象,在能够存储各种键值对方面类似于 Session 对象。
使用公共结构。它们比类更有效,比枚举更灵活。
使用以下代码创建一个文件(最好在“/Classes”文件夹中):
public struct CreditCardReasonCodes
{
public const int Accepted = 100;
public const int InsufficientFunds = 204;
public const int ExpiredCard = 202;
}
重要提示:不要放置任何命名空间,以便在您的 Web 应用程序中全局看到该结构。
要在您的代码中引用它,只需使用以下语法:
if (webServiceResult == CreditCardReasonCodes.Accepted)
{
Console.WriteLine("Authorization approved.")
}
使用“const”成员还可以使您的值在编译时不可变,在应用程序执行期间不可能修改它们。
更重要的是,我强烈建议您阅读伟大的文章https://lowleveldesign.org/2011/07/20/global-asax-in-asp-net/以了解 global.asax 中的 Global 类是如何工作的。