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

构造函数不是静态的,因为它将字符串作为参数,并且私有静态 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 回答