0

我想实现一个类,其实例是全局的,但其属性在运行时仅初始化一次。

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

基本上我想做这样的事情

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,因此 GetParamsFromDB() 不能在 AppConfig 类中使用

4

3 回答 3

1

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

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

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

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

于 2013-09-13T14:19:57.710 回答
1

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

请参阅:在 C# 中实现单例模式

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

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

但是,您应该考虑更改您的设计,因为单例经常被过度使用

考虑一些可以与依赖注入和控制反转一起使用的东西。

  • 依赖注入是一种通过接口增加代码重用和最小化依赖的模式。

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

例子:

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 容器一起使用,为所有需要它的对象提供配置。

于 2013-09-13T14:12:52.543 回答
0

您正在尝试做的是一种单例模式,它可以实现如下,

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;
      }
   }
}
于 2013-09-13T14:13:51.980 回答