C#工厂问题

时间:2011-10-11 20:50:51

标签: c# .net inheritance factory

所以我一直在解决一些问题,而且我真的很接近,但我遇到了问题。

所以这就是我打电话给工厂的方式:

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.");

            }
        }
    }

现在我正试着Assert ExceptionExcelImporter课程中看到的classImporter.Import();

ExpectedException

我的测试归结为有一个ClassImporter,但看起来当我通过它调试时,[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(); } 类上托管的导入器基本上是在查看它自己的选项而不是基本选项创建它的主类,然后没有看到传入的选项,只是它们的空副本。

我该如何重做?

编辑:完整测试:

{{1}}

2 个答案:

答案 0 :(得分:2)

你得到NullReferenceException,不是吗?

执行此操作时:

public ExcelImporter() : base() {}

您没有将任何ImportOptions传递给基类。所以它永远不会被设置,因此在您检查选项的行中,base.Options将始终为null。

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

答案 1 :(得分:1)

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

您可以通过几种方式解决此问题,但最简单的方法是使ExcelImporter与其他子类一样工作,并使用一个带有ImportOptions的构造函数。然后从GetImporter调用该构造函数。不要链接它们 - 这将永远循环。

真的,我不明白为什么ExcelImporter是ClassImporter的派生类。它没有使用任何ClassImporter的功能,而你正在为构造函数设置一个无限循环。只需在制作实例时给它选项。