【问题标题】:Singleton Pattern / Check for Null - While using Asp.Net with Session单例模式/检查 Null - 在使用带有会话的 Asp.Net 时
【发布时间】:2011-08-03 23:14:07
【问题描述】:

在下面的代码中,我希望在 Asp.net 应用程序的每个会话中只执行一次“GetClassTeacher”方法,我在调用数据库之前使用会话检查对象是否为空。

我的问题是,这是实现此方法的最佳方式还是我可以使用单例模式来实现这一点,如果可以,如何在每个会话中实现它。

public class School
{
   public  List<Student> GetAllStudents() {}

  public  List<Teacher>  GetAllTeachers() {}    

  //Singleton pattern or Check for Null
  public Teacher GetClassTeacher()
   {
       Teacher  teacher = new Teacher();
       teacher = Session["Teacher"] as Teacher
       if (teacher == null)
       {
            //Get Teacher Info from Database
       }   
   }
}

【问题讨论】:

  • 为什么要创建一个新的Teacher 实例,然后每次调用GetClassTeacher() 时都将其丢弃?

标签: c# asp.net


【解决方案1】:

我认为使用 session 很好——但是如果你不需要,你可以通过不实例化一个teacher对象来减少一些开销:

   public Teacher GetClassTeacher()
   {
       var teacher = Session["Teacher"] as Teacher
       if (teacher == null)
       {
            //Get Teacher Info from Database
       }   
   }

【讨论】:

  • 感谢您的回复,您认为当您从会话中实例化并分配它时会占用更多内存吗?
  • 好吧,实例化一个对象肯定会使用内存——我假设如果你没有找到老师,你会返回 null。另一方面,如果你返回一个新创建的 Teacher 对象,你应该保留你所拥有的。在任何情况下,只要内存稍微不稳定就可以使用会话状态,并且如果应用程序变大时不会出现扩展问题。
  • @user841683:任何时候你说new ...,它都会占用内存。这只是允许您避免创建一个新实例,无论如何您最终都会在下一行覆盖。
【解决方案2】:

检查 null 是完全有效的。使用 Session 也是有效的。

    public static Teacher GetClassTeacher()
    {
        Teacher teacher = HttpContext.Current.Session["Teacher"] as Teacher;
        if (teacher == null)
        {
            //Get Teacher Info from Database
            teacher = GetTeacherFromDB();
            HttpContext.Current.Session["Teacher"] = teacher;                
        }
        return teacher;
    }

【讨论】:

    【解决方案3】:

    这是一个单例示例:http://msdn.microsoft.com/en-us/library/ff650316.aspx。此外,对不同实现的一些调查:http://www.yoda.arachsys.com/csharp/singleton.html

    否则,我不确定如何说使用单例(或不使用单例)是否“最好”。您的情况将有助于确定它。就我个人而言,我在 asp.net 中所做的工作并不需要它。

    【讨论】:

    • 在 Asp.Net 中,我将在什么情况下使用单例,因为大部分工作都可以通过 Session / Cache / Static 通过检查它是否为空来完成
    • 如果我理解单例...大如果...它们旨在阻止您创建多个类的实例。但如果它们能够中断代码执行,它们可能会成为一个大问题。只要您在实例化之前始终小心检查 null,那么无论您是否使用单例,效果都是一样的。那么为什么要使用它呢?我会说不要。这里有更深入的讨论:stackoverflow.com/questions/228164/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多