1

我有一个 Windowsphone 客户端,它通过 Web 服务调用业务层类(C# 类)。

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

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

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

第一次调用
Client -> webservice -> businesslayer =List<int> numbers获取值
第二次调用(问题)
Client -> webservice -> businesslayer = List<int> numbers我希望列表保留第一次调用的值,但它是空的,因为我无法将列表保存到ApplicationState 或独立存储之类的东西。

这是我关于这个问题的代码

    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();            
         }
4

1 回答 1

3

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

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

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

如果您认为您的列表没有改变,那么您不需要将它存储在数据库中,您可以使用一个 XML 文件。

于 2012-04-25T09:03:26.657 回答