C# 我如何测试一门课?
我有一节这样的课C# 我如何测试一门课?,c#,oop,C#,Oop,我有一节这样的课 public class BonusImageHandler { private static IStorageProvider _storageProvider; private static Type storageProviderType; private static readonly object _lock = new object(); private static IStorageProvider StorageProvider
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函数。
对于这个愚蠢的问题我很抱歉,但我还是个初学者。这很糟糕,因为实例构造函数分配静态字段;考虑:
var x = new BonusImageHandler("foo");
var y = new BonusImageHandler("bar");
现在。。。什么是静态的存储提供者类型
,为什么这样做有意义?x
使用什么处理程序?(提示:它不是“foo”
)
现在考虑多个调用方,也许在不同的线程上,调用这个看起来是随机的。< /P> 坦率地说,这看起来应该更像:
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;}
这是不好的,因为实例构造函数分配静态字段;考虑:
var x = new BonusImageHandler("foo");
var y = new BonusImageHandler("bar");
现在。。。什么是静态的存储提供者类型
,为什么这样做有意义?x
使用什么处理程序?(提示:它不是“foo”
)
现在考虑多个调用方,也许在不同的线程上,调用这个看起来是随机的。< /P> 坦率地说,这看起来应该更像:
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;}
首先,它需要
HttpContextBase
。为什么在一个方法中连续两次lock(\u lock)
?(2) 什么不起作用?(3) 在get
上,锁定同一对象两次。别这样,你的问题是什么?“这样不行”是含糊不清的。@MarcGravel我不是自己做的。我刚刚创建了构造函数,以便能够确定我可以使用哪种提供程序类型。最初的代码是这样的:首先,它需要HttpContextBase
。为什么在一个方法中连续两次lock(\u lock)
?(2) 什么不起作用?(3) 在get
上,锁定同一对象两次。别这样,你的问题是什么?“这样不行”是含糊不清的。@MarcGravel我不是自己做的。我刚刚创建了构造函数,以便能够确定我可以使用哪种提供程序类型。最初的代码是that@MarkGravell这是我最初的问题,所以我就这样做了。@MuhammadA.fared-Alex的回答很糟糕。很抱歉但是它是。@markgravel那么你建议我做什么呢???@MuhammadA.fared我想我在回答中已经提到了这一点,有两种不同的方法(一种是静态的,另一种是每个实例的),当我8岁时,老师向我们解释了如何将235除以23,这对他来说太容易了,对我们来说太难理解了,在这个年龄。我想我现在正处于编程的同一阶段。无论如何,非常感谢你。我会尝试运用你的建议。@markgravel这是我最初的问题,所以我就这样做了。@MuhammadA.fared-Alex的答案很糟糕。很抱歉但是它是。@markgravel那么你建议我做什么呢???@MuhammadA.fared我想我在回答中已经提到了这一点,有两种不同的方法(一种是静态的,另一种是每个实例的),当我8岁时,老师向我们解释了如何将235除以23,这对他来说太容易了,对我们来说太难理解了,在这个年龄。我想我现在正处于编程的同一阶段。无论如何,非常感谢你。我会尽量采纳你的建议。