2017-03-27 2 views
0

リファレンスデータサービスレイヤーを静的な実装に変更しようとしていて、シングルトンパターンを適用しようとしています。理由は、リファレンスサービスがパフォーマンスの向上のために静的になることができると思います(すべて同じ「インスタンス」を共有しています - 私は思っていますか?)シングルトン、スタティックおよびIoC

私は階層化されたアプリケーションを持っています。 UI->サービス - >ロジック - >データ

しかし、IoCを使用していますが、ここでは衝突があると思います。私はIoCコンテナとしてUnityを使用します。私は、静的インスタンスを追加して変換を開始しています。インスタンスを処理するパブリックインスタンス。

しかし、私は自分のコンストラクタとどうすればよいか分かりません。 I(ユニティ)現在

...コンストラクタに私のリファレンスデータ・ロジック・クラスを注入
public class ReferenceDataService : IReferenceDataService 
{ 

    private static ReferenceDataService instance; 

    IReferenceDataLogic _refDataLogic; 
    ObjectCache cache = MemoryCache.Default; 

    public ReferenceDataService(IReferenceDataLogic logic) 
    { 
     _refDataLogic = logic; 
    } 

    public static ReferenceDataService Instance { 

     get 
     { 
      if(instance != null) return instance; 
      lock(new object()) 
      { 
       instance = new ReferenceDataService(); 
      } 
      result instance; 
     } 
    } 
} 

しかし、私は私のUIのコードでは、私がデータを取得することができるように、このコンストラクタを削除する必要があると思うが、と言っ:

var MyReferenceDataList = ReferenceDataService.Instance.GetMyReferenceDataList(type); 

論理層とデータアクセス層のクラスを静的にする必要がありますか?つまり、私はこれを本当にテストすることはできません。

+3

これを行う必要はありますか?元の実装を使用して単一のインスタンスを作成することはできませんか? – Fran

+0

私は確信していません、@フラン - 私はそれを調べます。 – Craig

+0

ここで私を教育したようです。私のUnityコンテナで、私はこれを単に行うことができます:myContainer.RegisterType (new ContainerControlledLifetimeManager()); - つまり、クラスはシングルトンとして扱われますか?サービスレイヤークラス、ロジッククラス、データベースクラスを変更する必要があると思いますか? – Craig

答えて

1

単一のインスタンスを返すようにコンテナに指示するだけで済みます。私はユニティに精通していませんが、キャッスルウィンザーであなたはシングルトンにライフスタイルを設定しました

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IProvideWellKnownData)) 
    .WithServiceAllInterfaces() 
    .LifestyleSingleton()); 
関連する問題