2017-09-27 15 views
0

いくつかのデータを格納するシングルトンファクトリを作成したいとします。データの一部はXMLファイルから取得され、その一部はハードコードされています。 データが入っていて、クラスに実装されているインターフェイスIMyConfigDataを定義することをお勧めしました。XMLとハードコードされた構成データを保持するインタフェース

  1. これは良いデザインですか?クラスに直接データを含めるのではなく、インターフェイスを定義して実装する利点は何ですか?

  2. クラスプロパティにアクセスする際に、以下のシングルトンをスレッドセーフにしたいと考えていますか?どのように私はこれを達成するのですか?

  3. には、EntityIdSiteEntityIdApplicationの2つのフィールドがあります。私はSiteApplicationを含むEntityIdというクラスにこれら2つを組み合わせました。このように要素を組み合わせるとXMLからのシリアル化に影響がありますか?

インタフェース:

public class EntityId 
{ 
    ushort Site { get; set; } 
    ushort Application { get; set; } 
} 

public interface IMyConfigData 
{ 
    //ushort EntityIdSite { get; set; } 
    //ushort EntityIdApplication { get; set; } 

    EntityId entityId {get; set;} 

    ushort ETypeCountry { get; set; } 

    byte ETypeCategory { get; set; } 

    byte ETypeSubCategory { get; set; } 

    UInt32 PortNumber { get; set; } 
} 

XML:

<?xml version="1.0" encoding="utf-8" standalone="no" ?> 
<Configuration xmlns="http://test.com/MyConfiguration"> 
    <Settings> 
    <setting owner="MySServer" name="AllowEditOnAreas" value="0"/> 
    <Setting owner="MySServer" name="ApplicationId" value="10"/> 
    <Setting owner="MyServer" name="Port" value="3000"/> 
    </Settings> 
</Configuration> 

実装:

public sealed class Singleton : IMyConfigData 
{ 
    private static readonly Lazy<Singleton> lazy = 
     new Lazy<Singleton>(() => new Singleton()); 

    public static Singleton Instance 
    { 
     get { 
      return lazy.Value; 
     } 

    } 
    private Singleton() 
    { 
    } 
} 

答えて

0

シングルトン - クラスはインスタンスを1つだけ持っているとへのアクセスのグローバルなポイントを提供それ。ここで

が私の答えです:

1)あなたのクラスはインスタンスを1つだけ持つことになりますので、インタフェースとしてそれを宣言する必要はありません。さらに、クラスにはメソッドがありません。それは

private static object syncLock = new object(); 

    lock (syncLock) 
    { 
     if (_instance == null) 
     { 
     _instance = new Singleton();//class to be initialized once 
     } 
    } 

3同期を確認するために、マルチスレッドアプリケーションの使用のロックをサポートするために、スレッドセーフにするために

2))は、XMLから直列化に影響を与えるこのように要素を組み合わせていますか? これはシリアル化に大きな影響を与えません。 EntityIdが他の場所で使用されていない場合、それらのプロパティをメインクラスに戻す方がよい。

ここに完全なサンプルがあります。

public class MyConfigData 
{ 
    ushort EntityIdSite { get; set; } 

    ushort EntityIdApplication { get; set; } 

    ushort ETypeCountry { get; set; } 

    byte ETypeCategory { get; set; } 

    byte ETypeSubCategory { get; set; } 

    public UInt32 PortNumber { get; set; } 

    private static MyConfigData _instance; 

    // Lock synchronization object 
    private static object syncLock = new object(); 

    protected MyConfigData() 
    { 
    } 

    public static MyConfigData GetInstance() 
    { 
     if (_instance == null) 
     { 
      lock (syncLock) 
      { 
       if (_instance == null) 
       { 
        _instance = new MyConfigData(); 
       } 
      } 
     } 

     return _instance; 
    } 
} 

以下に示す静的メソッドを使用してこのクラスのリファレンスを取得します。クラスの外部にアクセスする必要がある場合は、そのプロパティをpublicとして公開します。たとえば、この場合、私はPortNumberをpublicとして宣言しました。

MyConfigData configData = MyConfigData.GetInstance(); 
var port = configData.PortNumber; 
+0

ここでは、シングルトンを作成するためにデリゲートを使用しています。そのインスタンスでロックを使用するにはどうすればいいですか? 'EntyId'を' IMyConfigData'に移動し、(Interface'の代わりに) 'IMyConfigData'をクラスとして宣言しています。 – liv2hak

+0

私はあなたがどのようにそれにアクセスしているのかわかりません。私は完全な実装で私の答えを更新しました。私の推薦は、EntityIdが参照される他の場所がない場合、IMyConfigDataにEntityIdを移動し、IMyConfigDataをクラスとして宣言することです。 – Rex

関連する問題