Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何测试一门课?_C#_Oop - Fatal编程技术网

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,这对他来说太容易了,对我们来说太难理解了,在这个年龄。我想我现在正处于编程的同一阶段。无论如何,非常感谢你。我会尽量采纳你的建议。