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类中看到的ExceptionAssert,用这一行:

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();
        }

c#工厂问题

你得到一个NullReferenceException,是吗?

当你这样做的时候:

public ExcelImporter() : base() {}

你没有传递任何ImportOptions到基类。所以它永远不能被设置,所以在你检查选项的那一行,base.Options将永远是空的。

(但是这个设计看起来应该永远循环当你创建一个ClassImporter,所以我不清楚你想要完成什么)

ExcelImporter是唯一一个使用默认构造函数的类。它从不设置Options字段。无参数基构造函数也不设置它。因此,基本上,您创建了一个具有正确选项的classsimporter实例,并将其Importer属性设置为一个没有选项的新ExcelImporter实例。

您可以通过几种方法修复此问题,但最简单的方法是使ExcelImporter与其他子类一样工作,并具有一个接受ImportOptions的构造函数。然后从GetImporter调用该构造函数。但不要把它们链接起来——这会永远循环下去。

真的,我不明白为什么ExcelImporter是ClassImporter的派生类。它不使用任何classsimporter的功能,并且您正在为自己设置一个带有构造函数的无限循环。当你创建实例的时候给它一些选项。