2017-09-27 57 views
0

我想創建一個存儲某些數據的單件工廠。部分數據來自XML文件,其中一部分是硬編碼的。 我被建議定義一個接口IMyConfigData,它包含數據並讓我的類實現它。保存XML和硬編碼配置數據的接口

  1. 這是一個很好的設計嗎?定義和實現接口的優點是什麼,而不是將數據直接包含在類中?

  2. 我想在訪問類屬性時使下面的單例線程安全嗎?我如何實現這一目標?

  3. IMyConfigData有兩個字段,即EntityIdSiteEntityIdApplication。我已將這兩者合併到名爲EntityId的課程中,其中包含SiteApplication。以這種方式組合元素是否會影響從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)由於你的類只有一個實例,就沒有必要將它聲明爲接口。而且你的類有屬性沒有任何方法。

2)爲了使線程安全,支持多線程應用程序中使用的鎖,檢查同步

private static object syncLock = new object(); 

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

3)是否合併這樣的元素從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; 
    } 
} 

使用下面顯示的靜態方法獲取此類的引用。公開財產作爲公開,無論在課堂以外都需要訪問。例如,在這種情況下,我宣佈PortNumber爲public。

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

我在這裏使用委託構造單例。在這種情況下如何使用鎖。您建議將'EntityId'移動到'IMyConfigData'並將'IMyConfigData'聲明爲一個類(而不是'Interface') – liv2hak

+0

我不確定代表如何訪問它。我已經更新了完整實施的答案。我的建議是將EntityId移動到IMyConfigData並將IMyConfigData聲明爲一個類,如果根本沒有其他地方引用EntityId的話。 – Rex