c#工厂问题
本文关键字:问题 工厂 | 更新日期: 2023-09-27 18:11:04
我一直在解决一些问题,我已经很接近了,但是我遇到了一个问题。
我是这样调用我的工厂的:
ClassImporter classImporter = new ClassImporter(importOptions);
有多种类型的ClassImporter
对象,这是ClassImporter
基类的一种类型。
public class ClassImporter
{
public ImportOptions Options;
public ClassImporter Importer;
public ClassImporter()
{
}
public ClassImporter(ImportOptions options)
{
this.Options = options;
this.Importer = ClassImporterFactory.GetImporter(options);
}
public virtual List<Class> Import()
{
return Importer.Import();
}
}
public class ExcelImporter : ClassImporter, IClassImporter
{
public ExcelImporter() : base()
{
}
public override List<Class> Import()
{
if (base.Options.FileLocation == string.Empty)
{
throw new BlankFilenameException("A blank Excel file location was supplied.");
}
return new List<Class>();
}
}
这里是Factory
类
public class ClassImporterFactory
{
public static ClassImporter GetImporter(ImportOptions options)
{
switch (options.FileType)
{
case FileType.CSV:
return new CSVImporter(options);
case FileType.Excel:
return new ExcelImporter();
case FileType.MySQL:
return new MySQLImporter(options);
case FileType.Oracle:
return new OracleImporter(options);
case FileType.ScreenScraper:
return new ScreenScraperImporter(options);
case FileType.SQL:
return new SQLImporter(options);
case FileType.XML:
return new XMLImporter(options);
case FileType.NotSet:
default:
throw new BlankImportTypeException("Import type was not specified in the Import Options.");
}
}
}
现在我正试图在ExcelImporter
类中看到的Exception
上Assert
,用这一行:
classImporter.Import();
我的测试归因于有一个ExpectedException
,但看起来当我通过它调试时,托管在ClassImporter
类上的Importer基本上是在看它自己的选项,而不是创建它的主类的基本选项,然后因此看不到传入的选项,只是它们的空副本。
我怎样才能重做这个?
编辑:完整测试:
[TestMethod]
[ExpectedException(typeof(BlankFilenameException), "A blank Excel file location was supplied.")]
public void LoadExcelFile_EmptyName_ReturnsBlankFilenameException()
{
ImportOptions importOptions = new ImportOptions(FileType.Excel, string.Empty);
ClassImporter classImporter = new ClassImporter(importOptions);
classImporter.Import();
}
你得到一个NullReferenceException
,是吗?
当你这样做的时候:
public ExcelImporter() : base() {}
你没有传递任何ImportOptions
到基类。所以它永远不能被设置,所以在你检查选项的那一行,base.Options
将永远是空的。
(但是这个设计看起来应该永远循环当你创建一个ClassImporter
,所以我不清楚你想要完成什么)
ExcelImporter是唯一一个使用默认构造函数的类。它从不设置Options字段。无参数基构造函数也不设置它。因此,基本上,您创建了一个具有正确选项的classsimporter实例,并将其Importer属性设置为一个没有选项的新ExcelImporter实例。
您可以通过几种方法修复此问题,但最简单的方法是使ExcelImporter与其他子类一样工作,并具有一个接受ImportOptions的构造函数。然后从GetImporter调用该构造函数。但不要把它们链接起来——这会永远循环下去。
真的,我不明白为什么ExcelImporter是ClassImporter的派生类。它不使用任何classsimporter的功能,并且您正在为自己设置一个带有构造函数的无限循环。当你创建实例的时候给它一些选项。