1

Webサービスを介してビジネスレイヤークラス(C#クラス)を呼び出すWindowsphoneクライアントがあります。

私のビジネスレイヤークラスでは、私が持っているsilverlightclassではなくC#クラスです。List<int> numbers = new List<int>() そして、ビジネスレイヤークラスのメソッドから、リストは数字で埋められます。このメソッドがリストに番号を入力した後、クライアントレイヤーが再度呼び出され、クライアントの新しいメソッドが呼び出され、ビジネスレイヤーに戻ります。List<int> numbersここに問題があります。クライアント層からビジネス層への呼び出しの間にデータを入力したままにしておきたいのです。これで、ビジネスレイヤーが呼び出されるたびに、List<int> numbersが空になります。

Silverlightクラスでは、分離されたストレージを使用して、アプリケーションレベルでデータを存続させることができます。asp.netでは、アプリケーションの状態やセッションなどを使用できます。

このリストをC#クラスに保存して、呼び出しの合間にリストにデータを保存するにはどうすればよいですか?

1回目の呼び出し
Client->webservice->businesslayer =List<int> numbers値を取得します
2回目の呼び出し(問題)
Client-> webservice-> businesslayer = List<int> numbersリストに最初の呼び出しからの値を保持させたいのですが、リストをApplicationStateやIsolatedStorageのようなもの。

これがこの問題に関する私のコードです

    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 に答える