用于保存XML和硬编码配置数据的接口

时间:2017-09-27 20:10:40

标签: c# xml

我想创建一个存储一些数据的单件工厂。部分数据来自XML文件,其中一部分是硬编码的。 我被建议定义一个包含数据并让我的类实现它的接口IMyConfigData

  1. 这是一个好设计吗?定义和实现接口的优点是什么,而不是直接在类中包含数据?

  2. 我想在访问类属性时使下面的单例线程安全吗?我该如何实现这个目标?

  3. IMyConfigData中有两个字段,即EntityIdSiteEntityIdApplication。我将这两个组合成一个名为EntityId的类,其中包含SiteApplication。以这种方式组合元素是否会影响XML的序列化?

  4. 接口:

    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()
        {
        }
    }
    

1 个答案:

答案 0 :(得分:0)

Singleton - 一个类只有一个实例,并提供对它的全局访问点。

以下是我的回答:

1)由于您的类只有一个实例,因此无需将其声明为Interface。而且你的类有属性没有任何方法。

2)为了使其线程安全以支持多线程应用程序,请使用lock来检查同步

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;