替换.net Web应用程序中的静态变量

时间:2014-12-07 17:07:22

标签: c# asp.net xml

我没有问题,但我正在努力防止将来出现问题,并希望找到一些方法来找出解决问题的正确方法。我有一个供应商,他将XML发布到我创建的网页上。这可能每2分钟发生一次。然后,该网页将读取发布的XML并插入到数据库中。 序列化XML和插入是不够好的,所以在将数据发送到数据库之前我必须做一些解析。我创建了一个类似于以下内容的静态类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for Accounting
/// </summary>
public static class Accounting
{
    public static String currentFile = "";
    public static List<string> PurchaseOrder = new List<string>();
    public static List<string> item = new List<string>();
    public static List<string> unitPrice = new List<string>();
    public static List<string> shippingCharge = new List<string>();
    public static List<string> handlingCharge = new List<string>();
    public static List<string> discountAmount = new List<string>();
    public static List<string> UOM = new List<string>();
    public static List<string> invoiceNumber = new List<string>();
    public static List<string> supplierNumber = new List<string>(); //{ get; set; }
    public static List<string> supplierInvoiceNo = new List<string>();
    public static List<string> account = new List<string>();
    public static List<string> fund = new List<string>();
    public static List<string> org = new List<string>();
    public static List<string> prog = new List<string>();
    public static List<string> activity = new List<string>();
    public static List<string> location = new List<string>();
    public static List<string> distributionType = new List<string>();
    public static List<string> distributionValue = new List<string>();
    public static List<int> sequence = new List<int>();
    public static List<string> quantity = new List<string>();
    public static List<string> dueDate = new List<string>();
}

这个类是静态的,因为我需要对来自不同方法的变量进行操作。 现在这里的事情变得棘手,我一直在阅读如果我在.NET Web应用程序中使用静态变量,我将最终在会话中共享变量。这对我来说可能是一场噩梦。所以我查看了单例模式,并且我还通过stackover流程找到了这个Static variables in web applications解决方案。    我读到我应该做这样的事情

public class SingletonPerRequest
{
    public static SingletonPerRequest Current
    {
        get
        {
            return (HttpContext.Current.Items["SingletonPerRequest"] ??
                (HttpContext.Current.Items["SingletonPerRequest"] = 
                new SingletonPerRequest())) as SingletonPerRequest;

        }
    }
}

我的问题是,我不知道如何将我的课程转换为基本上做上述操作。换句话说,如何设置类以遵循此单例请求模式。如果这没有意义,请原谅我的愚蠢。我的最终目标是让页面的每个请求都有自己的会计变量会话,而不是跨会话共享。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是你的班级:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

public class Accounting
{
    public static Accounting Current
    {
        get
        {
            return (HttpContext.Current.Items["Accounting"] ??
                (HttpContext.Current.Items["Accounting"] = 
                new Accounting())) as Accounting;

        }
    }

    public String currentFile = "";
    public List<string> PurchaseOrder = new List<string>();
    public List<string> item = new List<string>();
    public List<string> unitPrice = new List<string>();
    public List<string> shippingCharge = new List<string>();
    public List<string> handlingCharge = new List<string>();
    public List<string> discountAmount = new List<string>();
    public List<string> UOM = new List<string>();
    public List<string> invoiceNumber = new List<string>();
    public List<string> supplierNumber = new List<string>(); //{ get; set; }
    public List<string> supplierInvoiceNo = new List<string>();
    public List<string> account = new List<string>();
    public List<string> fund = new List<string>();
    public List<string> org = new List<string>();
    public List<string> prog = new List<string>();
    public List<string> activity = new List<string>();
    public List<string> location = new List<string>();
    public List<string> distributionType = new List<string>();
    public List<string> distributionValue = new List<string>();
    public List<int> sequence = new List<int>();
    public List<string> quantity = new List<string>();
    public List<string> dueDate = new List<string>();
}

你可以像这样使用单身:Accounting::Current.quantity

注意:

  

使用静态类是OOP中的反模式。静态类就像方法的命名空间集合。您无法实例化阻止您使用继承,接口,低耦合,依赖注入等的对象......总是使用singleton代替。这将有助于您创建更好的架构。您还应该看看OOP中的SOA(面向服务的体系结构),然后是HTTP(REST Web服务)。

答案 1 :(得分:0)

Singleton模式用于确保在整个应用程序中共享对象的单个实例,因此听起来与您尝试实现的相反。

在你的问题的后半部分,听起来你想要为每个请求一个单独的实例,这实际上是ASP.NET默认处理对象的方式(在ASP.NET lifecycle overview page上的Page.Load和Unload上阅读详情)。

如果是这种情况,除了将其从静态类转换为普通类之外,您不需要做任何特殊操作。你看到了什么行为?

顺便说一下,您可能需要查看Linq for Xml,它内置于框架中,可以简化XML解析。使用Linq,您可以通过使用XML查询来检索数据,从而摆脱对许多静态变量的需求。