在从客户端到业务层的调用之间保存List中的数据

时间:2012-04-25 08:52:48

标签: c# web-services silverlight windows-phone-7

我有一个通过网络服务调用业务层类(C#类)的Windowsphone客户端。

在我的业务层类中,这是一个C#类,而不是silverlightclass,我有List<int> numbers = new List<int>() 从业务层类中的方法,列表中填充了数字。在此方法用数字填充列表后,将再次调用客户端层,并调用客户端中的新方法,然后再次返回业务层。这是问题所在,我希望在从客户层到业务层的调用之间保持List<int> numbers。现在,每次调用业务层时,List<int> numbers都会变空。

在silverlight类中,我可以使用独立存储来保持应用程序级别的数据存活。在asp.net中,我可以使用应用程序状态,会话或其他任何内容。

如何将此List存储在C#类中以在调用之间将数据保存在List中?

第一次通话
客户 - &gt; webservice - &gt; businesslayer = List<int> numbers获取值
第二次通话(问题)
客户 - &gt; webservice - &gt; businesslayer = List<int> numbers我希望列表保留第一次调用的值,但它是空的,因为我无法将列表保存为ApplicationState或Isolated Storage等。

这是关于这个问题的代码

    public class TimereportDataAccess
    {
        TimereportDBEntities1 context = new TimereportDBEntities1();

        List<int> dayId = new List<int>(); // Used in sendDays() and sendWeeks()
        bool submitStatus = true; // Used in sendDays() and sendWeeks()

        public List<int> sendDays(List<Common.Day> days, bool status)
         {
            TimereportMappers mapper = new TimereportMappers();

             foreach(var item in mapper.dayMap(days))
             {
                context.Days.AddObject(item);
                context.SaveChanges();
                dayId.Add(item.Id);
             }

            if (status == true)
            {
                 submitStatus = true;
            }
            else
             {
                 submitStatus = false;
             }

              return dayId;
         }

         public void sendWeeks(List<Common.Week> weeks)
        {
            TimereportMappers mapper = new TimereportMappers();

             foreach (var item in mapper.weekMap(weeks))
             {              
                  context.Weeks.AddObject(item);
             }
             context.SaveChanges();


             int firstday;
             firstday = dayId.FirstOrDefault();
             if (submitStatus == true )
             {
                int reportId = (from u in context.Users
                                join r in context.Reports on u.Id equals r.UserId
                                join w in context.Weeks on r.Id equals w.ReportId
                                join d in context.Days on w.DayId equals d.Id
                                where d.Id.Equals(firstday)
                                select r.Id).SingleOrDefault();

                Reports report = context.Reports.SingleOrDefault(i => i.Id == reportId);
                report.Status = "submitted";
                context.SaveChanges();
             }

             dayId.Clear();            
         }

1 个答案:

答案 0 :(得分:3)

为了使您的对象保持在内存中,首先需要确保您的wcf服务在每个调用模式下都不起作用。如果是这种情况,则每次调用服务时,都会生成一个包含新对象的新线程。我假设您已根据会话标记了您的服务。

然后你可以将对象标记为静态,在第一次调用时,你可以从数据库中获取数据;当服务接收到另一个呼叫时,您只需检查您的列表是否已填充并发送回内存列表。

另一方面,这种方法存在问题;如果数据库改变怎么办?即使数据库发生更改,列表也保持不变。因此,您需要使用某种脏机制并将列表标记为脏。每当它变脏时,你需要从数据库中再次获取它。

如果您认为您的列表没有更改,那么您不需要将其存储在数据库中,您只需使用XML文件。