C# 跨多个类存储公共设置的最佳模式

C# 跨多个类存储公共设置的最佳模式,c#,inheritance,multiple-inheritance,C#,Inheritance,Multiple Inheritance,我正在创建两个单独的类来访问自定义文件。让我们调用我的类MyReader和MyWriter 我遵循与.NET类相同的模式,如StreamReader和StreamWriter等,其中有一个单独的读写类。除了遵循既定的模式外,这也为我解决了一些其他问题 但是,我确实需要reader和writer类的一些常见设置。例如,我有一个用户应该能够更改的分隔符。我还有一些固定数据,其中包含用于解析的公共信息 有人能推荐一种好的模式,特别是遵循常见的.NET framework实践的模式,用于为这样的多个类创

我正在创建两个单独的类来访问自定义文件。让我们调用我的类
MyReader
MyWriter

我遵循与.NET类相同的模式,如
StreamReader
StreamWriter
等,其中有一个单独的读写类。除了遵循既定的模式外,这也为我解决了一些其他问题

但是,我确实需要reader和writer类的一些常见设置。例如,我有一个用户应该能够更改的分隔符。我还有一些固定数据,其中包含用于解析的公共信息

有人能推荐一种好的模式,特别是遵循常见的.NET framework实践的模式,用于为这样的多个类创建公共设置吗?我的类已从.NET类继承。似乎多重继承可能是一种方式,但在C#中似乎不受支持


(我正在使用Visual Studio 2012。)

尝试使用界面<代码>接口的工作原理类似于
抽象类
,但只能包含由实现它们的类“充实”的方法或属性定义。然后,类可以根据需要实现任意多的接口。看看
IEnumerable
如何允许列表、字典和数组共享一组公共方法,允许它们在
foreach
中使用,或者
IDisposable
如何允许使用
中声明类

我制作了一组墨迹文本框控件,所有这些控件都应该从多个应用程序的用户配置中获取其显示样式设置,因此我让它们从IILinkInputSettings接口获取这些设置,并在所有应用程序的UserConfig类中实现该接口

或者,您可以通过单例实现全局配置:

public class GlobalConfig{
    /* your configuration properties here */
    private static GlobalConfig instance = null;
    public static GlobalConfig Instance{
        get{
            if(instance == null) instance=new GlobalConfig();
            return instance;
        }
    }
    private GlobalConfig(){ /* set default property values */ }
}

这比具有静态成员的静态类要好,因为它只是在您第一次使用它时才被实例化。

这似乎是一个罕见的实例,其中一个可能很有意义:

public abstract class MyBase
{
    // This is the .NET class you're inheriting from, just putting it as a placeholder.
}

public class MyReader : MyBase
{
    private static readonly IMySettings settings = MySettings.Instance;
}

public class MyWriter : MyBase
{
    private static readonly IMySettings settings = MySettings.Instance;
}

internal interface IMySettings
{
    // Define your setting's properties, such as delimiter character.
}

internal sealed class MySettings : IMySettings
{
    private MySettings()
    {
    }

    public static IMySettings Instance
    {
        get
        {
            return Nested.Instance;
        }
    }

    // Implement your setting's properties, such as delimiter character.

    private static class Nested
    {
        private static readonly IMySettings instance = new MySettings();

        // Explicit static constructor to tell C# compiler not to mark type as beforefieldinit
        static Nested()
        {
        }

        public static IMySettings Instance
        {
            get
            {
                return instance;
            }
        }
    }
}

希望这有帮助。

您可以使用基于构造函数的依赖项注入将设置类插入到类中。让一个IoC容器启动一个设置类(不管是单例还是非单例),并基于基类或接口注入它,这将非常简单

public interface IStreamFilter
{
   string Delimiter {get; private set;}
   List<string> FilterCriteria {get; private set;}
}

public class StreamFilter : IStreamFilter
{
   public string Delimiter {get;}
   public List<string> FilterCriteria {get;}

   public void StreamFilter (string delimiter, List<string> filterCriteria)
   {
       this.Delimiter = delimiter;
       this.FilterCriteria = filterCriteria;
   }
}

在代码中要实例化MyReader类的任何地方,都可以创建IStreamFilter的新实例,并根据用户首选项(比如从用户配置文件)在构造函数中设置分隔符和其他筛选条件。然后将StreamFilter实例传递给MyReader实例。这样,您就可以在不依赖单例的情况下动态定制过滤器设置。

谢谢,但我不确定这会有什么帮助。它将定义接口,但我仍然必须在两个不同的地方实现该接口。我的理想情况是,用户可以在一个位置设置分隔符,这将同时影响reader和writer类。是否希望它影响这两个类的每个实例?你可以用一个单身汉,我不确定。你能详细说明我描述的两个类是如何实现的吗?谢谢。直到现在我才有机会仔细检查这件事。但老实说,我不明白为什么需要大部分代码。既然它在引用同一个
MySettings
实例时显示了
MyReader
MyWriter
的所有实例,为什么不将
MySettings
设为静态并直接引用它呢?为什么所有的接口、继承和私有类?单元可测试性、松散耦合,如果需要,仍然有对象继承。这些是一些。我可能更愿意使用tranceporter并通过构造函数注入它们,但这不是.NET FCL所做的,我试图用一些额外的最佳实践来模拟它。
 public class MyReader
 {
      private IStreamFilter _streamFilter;

      public MyReader(IStreamFilter streamFilter)
      {
           this._streamFilter = streamFilter;
      }

      public string ReadString()
      { 
          var readString = reader.GetString(x => x.Contains(this._streamFilter.Delimiter);
           // apply the filter for reading string
      }
 }