1

私はこのようなクラスを持っています

public class BonusImageHandler
{   private static IStorageProvider _storageProvider;
    private static Type storageProviderType;
    private static readonly object _lock = new object();
    private static IStorageProvider StorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_storageProvider == null)
                {
                    lock (_lock)
                    {
                        _storageProvider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _storageProvider;
        }
    }

    public BonusImageHandler(string providerTypeName)
    {
        storageProviderType = Type.GetType(providerTypeName);
    }

   public void ProcessRequest(HttpContext context)
   {
        //do some thing here
    }

    private static string ParseInputs(string baseUrl, string imageType)
    {
      //do other things
     }
}

コンストラクターは引数として文字列を取り、プロパティ private static IStorageProvider StorageProvider は静的であるため、静的ではありません。チーム リーダーは、この方法ではうまくいかないと言っていましたが、なぜですか?? どうすればテストできますか?? httpContext を ProcessRequest 関数に渡すにはどうすればよいですか。初歩的な質問で申し訳ありませんが、よろしくお願いします。

4

1 に答える 1

4

インスタンスコンストラクターが静的フィールドを割り当てるため、これは悪いことです。検討:

var x = new BonusImageHandler("foo");
var y = new BonusImageHandler("bar");

今... static storageProviderTypeとは何ですか?なぜそれが理にかなっているのですか? どのハンドラxを使用しますか? (ヒント: そうではありません"foo")。

ここで、おそらく異なるスレッド上にある複数の呼び出し元を考えてみましょう。一見ランダムにこれを呼び出します。

率直に言って、これはもっと似ているはずです:

public static void InitProvider(string providerTypeName) {...}

しかし、それを行うまでに、次のようにする必要があるかもしれないと考え始めます。

public static void InitProvider(Type providerType) {...}

またはさらに明確:

public static void InitProvider(IStorageProvider provider) {...}

または: インスタンス フィールドにするだけで、(おそらく IoC/DI ツールを介して) プロバイダーを各インスタンスに個別に渡すことができます。つまり、

private readonly IStorageProvider provider;
public BonusImageHandler(IStorageProvider provider) {this.provider = provider;}
于 2012-08-03T12:51:18.233 に答える