我有一个这样的课程
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函数。 对于这个愚蠢的问题我很抱歉,但我还是初学者。
答案 0 :(得分:4)
这很糟糕,因为实例构造函数会分配 static 字段;考虑:
var x = new BonusImageHandler("foo");
var y = new BonusImageHandler("bar");
现在......什么是静态 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;}