4

カスタム ファイルにアクセスするための 2 つの個別のクラスを作成しています。私のクラスを呼び出しましょうMyReaderand MyWriter.

私は、StreamReaderやなどの .NET クラスがStreamWriter従うのと同じパターンに従っています。そこでは、読み取り用と書き込み用に別のクラスがあります。確立されたパターンに従うことに加えて、これは私にとって他のいくつかの問題も解決しました.

ただし、リーダー クラスとライター クラスの両方に共通の設定がいくつか必要です。たとえば、ユーザーが変更できる区切り文字があります。また、解析に使用される共通情報を含む固定データもいくつかあります。

このような複数のクラスに共通の設定を作成するための、特に一般的な .NET フレームワークのプラクティスに従うパターンを誰かが提案できますか? 私のクラスは既に .NET クラスから継承しています。多重継承は 1 つの方法のようですが、C# ではサポートされていないようです。

(Visual Studio 2012 を使用しています。)

4

4 に答える 4

3
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;
   }
}

Reader および Writer クラスのコンストラクターで IStreamFilter のインスタンスを渡すことができます。

 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
      }
 }   

MyReader クラスをインスタンス化するコード内の任意の場所で、コンストラクターで IStreamFilter の新しいインスタンスを作成し、ユーザー設定 (ユーザー プロファイルからとしましょう) に従って区切り文字とその他のフィルター条件を設定できます。次に、その StreamFilter のインスタンスを MyReader インスタンスに渡します。そうすれば、シングルトンに依存することなく、その場でフィルター設定をカスタマイズできます。

于 2012-10-04T16:08:10.117 に答える
1

これは、シングルトンが理にかなっているまれな例の1つと思われます。

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;
            }
        }
    }
}

お役に立てれば。

于 2012-10-04T15:20:57.280 に答える
1

コンストラクターベースの依存性注入を使用して、設定クラスをクラスに挿入できます。IoC コンテナーを取得して、シングルトンかどうかに関係なく設定クラスをスピンアップし、基本クラスまたはインターフェイスに基づいて注入するのは簡単です。

于 2012-10-04T15:24:18.263 に答える