具有只读属性的全局实例

时间:2013-09-13 14:09:09

标签: c# static global-variables readonly lazy-initialization

我想实现一个实例为全局但在运行时只能初始化一次的类。

此外,初始化将作为执行期间函数结果的赋值来完成。

基本上我想做这样的事情

public class Configuration
{
     public string param1 { get ; set; }
     public int param2 { get; set; }
}

public static class AppConfig
{
    public static readonly configuration;   
}

public class Initialize
{
    public void InitConfig()
    {
        AppConfig.configuration = GetParamsFromDB();
    }
}

但我无法弄清楚如何实现它。请忽略上述不正确的陈述。它只是提供所需要的东西。

  

修改

还需要单独的类Initialize,因为类Configuration和AppConfig在dll BO中。 GetParamsFromDB()在DAL中。因此DAL引用BO BO无法引用DAL因此无法在AppConfig类中使用GetParamsFromDB()

3 个答案:

答案 0 :(得分:1)

看起来你想要一个单身人士。

请参阅:Implementing the Singleton Pattern in C#

public static class AppConfig
{
    private static readonly Lazy<Configuration> _configuration = new Lazy<Configuration>(() => new Configuration());

    public static Configuration Instance { get { return _configuration.Value; } }
}

但是,您应该考虑将设计更改为singletons are often overused

考虑可以与dependency injection and inversion of control一起使用的内容。

  • 依赖注入是一种增加代码重用并通过接口减少依赖性的模式。

  • 控制反转是一种在运行时通常使用汇编程序对象将对象绑定在一起的模式。

示例:

public interface IAppConfig
{
    Configuration Configuration { get; }
}

public sealed class AppConfig : IAppConfig
{
    private readonly Configuration _configuration;

    public AppConfiguration()
    {
        _configuration = new Configuration { };
    }

    public Configuration Configuration { get { return _configuration; } }
}

这可以与IoC Container一起使用,为需要它的所有对象提供配置。

答案 1 :(得分:1)

您需要做的就是内联初始化:

public static class AppConfig
{
    public static readonly configuration = GetParamsFromDB();   
}

C#运行时将自动确保在第一次访问类之前不初始化参数,为您提供所需的behvaior。

请注意,您的configuration类型是可变的,如果您想确保这些值不会更改,那么这是一件坏事。您应该重构您的configuration类以接受其构造函数中的两个值,而不是为属性提供公共setter。

答案 2 :(得分:0)

你要做的是一种Singleton模式,它可以实现如下,

public sealed class Configuration
{
   private static volatile Configuration instance;
   private static object syncRoot = new Object();

   private Configuration() {}

   public static Configuration Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Configuration();
            }
         }

         return instance;
      }
   }
}