いくつかのデータを格納するシングルトンファクトリを作成したいとします。データの一部はXMLファイルから取得され、その一部はハードコードされています。 データが入っていて、クラスに実装されているインターフェイスIMyConfigData
を定義することをお勧めしました。XMLとハードコードされた構成データを保持するインタフェース
これは良いデザインですか?クラスに直接データを含めるのではなく、インターフェイスを定義して実装する利点は何ですか?
クラスプロパティにアクセスする際に、以下のシングルトンをスレッドセーフにしたいと考えていますか?どのように私はこれを達成するのですか?
には、
EntityIdSite
とEntityIdApplication
の2つのフィールドがあります。私はSite
とApplication
を含む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()
{
}
}
ここでは、シングルトンを作成するためにデリゲートを使用しています。そのインスタンスでロックを使用するにはどうすればいいですか? 'EntyId'を' IMyConfigData'に移動し、(Interface'の代わりに) 'IMyConfigData'をクラスとして宣言しています。 – liv2hak
私はあなたがどのようにそれにアクセスしているのかわかりません。私は完全な実装で私の答えを更新しました。私の推薦は、EntityIdが参照される他の場所がない場合、IMyConfigDataにEntityIdを移動し、IMyConfigDataをクラスとして宣言することです。 – Rex