2017-01-19 3 views
1

データベースからデータを取得してリストを作成するシングルトンクラスを作成するために、クライアントに送信する必要がある静的な(大きな)データがあります。 Windowsサービス内でサービスホストを起動するので、外部呼び出しでデータが空になったら、どうすればいいですか?Windowsサービスからシングルトンインスタンスを呼び出すWCFServiceが空の状態に戻る

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class CacheDataService : ICacheDataService 
{ 
    public List<Sale> GetDataFromImobDateById(int idImob, DateTime date) 
    { 
     return SalesHelper.Instance.GetDataFromImobDate(idImob, date); 
    } 
} 
public class SalesHelper 
    { 
     static Lazy<SalesHelper> singleton = new Lazy<SalesHelper>(() => new SalesHelper()); 
     public static SalesHelper Instance { get { return singleton.Value; } } 
     ICacheData<Sale> _cache; 
     List<Sale> CacheData = new List<Sale>(); 
     public void SetCache(ICacheData<Sale> cacheData) 
     { 
      _cache = cacheData; 
     } 
     public void ReloadCache() 
     { 
      CacheData.Clear(); 
      GetAllData(); 
     } 
     public void GetAllData() 
     { 
      CacheData = _cache.GetAllData(); 
     } 

     public List<Sale> GetDataFromImobDate(int idImob, DateTime date) 
     { 
      var result = (from r in CacheData 
          where r.Data_Alteracao.Equals(date) 
          && r.Id_Imobiliaria.Equals(idImob) 
          select r).ToList(); 
      return result; 
     } 
} 

とサービスに私はのServiceHostと私はあなたがSalesHelper.Instanceの初期化が欠けていると思うキャッシュ

_tempSales = new SalesHelper(); 
ICacheData<Sale> _cacheSale = new Sale(); 
_tempSales.SetCache(_cacheSale); 
_tempSales.GetAllData(); 
_service = new ServiceHost(typeof(CacheDataService)); 
+0

SalesHelperクラスも追加できますか? –

+0

申し訳ありませんが、私は間違ったクラス名を入れます。既に修正済みです。 –

+0

もう1つの質問:このメソッドのどこに 'GetDataFromImobDateById'を使用していますか?これがデータが空になる場所です。なぜ私はそれを求めているのですか? '_tempSales'はそれぞれのキャッシュで初期化されていますが、それは問題ありません。しかし、 'SalesHelper.Instance'は一度も設定されていません... –

答えて

2

を開始します。 これを実行するとnew Lazy<SalesHelper>(() => new SalesHelper());は、_cacheの初期化されていません。

私たちはいくつかの回避策を選択しました。 そのうちの一つは、Intance initilizeです:

SalesHelper.Instance.SetCache(_cacheSale); 

それは次のようになります。もう一つはキャッシュを受信し、それを設定する必要がありファクトリメソッドGetInstance()であなたの小道具Intanceを置き換えるです

//_tempSales = new SalesHelper(); 
ICacheData<Sale> _cacheSale = new Sale(); 
//_tempSales.SetCache(_cacheSale); 
//_tempSales.GetAllData(); 
SalesHelper.Instance.SetCache(_cacheSale); 
SalesHelper.Instance.GetAllData(); //Now it should return the info 
_service = new ServiceHost(typeof(CacheDataService)); 

それが必要な場合。

最初の回避策で問題が解決するかどうか教えてください。

+0

ああ、私は今テスト中ですが、意味があります。私がしていたことはまったく間違っていた。 –

+0

あなたの問題を解決すれば、私の答えは受け入れられたとマークし、投票してください!ありがとう。 :-) –

関連する問題