Class 基于给定数据的行为

Class behavior based on given data

我正在从控制器接收 IFormFile。 我接下来要做的是对其进行处理并获取其内容。我希望获得 .docx、.txt 或 .pdf 文件,并且我想要一个 class 来根据给定的扩展名处理这些文件中的任何一个。我创建并制作了我的 class 来做到这一点:

{
    public static class DocumentProcessor // Should it be like this?
    {
        public static string GetContent(IFormFile file)
        {
            var result = new StringBuilder();

            switch (Path.GetExtension(file.FileName))
            {
                case ".txt":
                {
                    using(var reader = new StreamReader(file.OpenReadStream()))
                    {
                        while (reader.Peek() >= 0)
                            result.AppendLine(reader.ReadLine());
                    }
                    break;
                }
            }
            return result.ToString();
        }
    }
}

无论如何,我觉得这是一个非常糟糕的解决方案,因为它是静态的。我可以使用策略模式,但我如何定义必须使用的策略上下文? 我是否应该创建另一个 class returns 依赖于 IFormFile 对象扩展的 Strategy 对象。但我觉得这也是一个糟糕的解决方案 我想知道解决这个问题的最佳方法是什么

创建新界面

interface IDocumentParser {
    string GetContent(IFormFile file);
}

每个解析器扩展实现一次该接口,例如:

class TextFileParser : IDocumentParser {
    public string GetContent(IFormFile file) {
        //your implementation code here
    }
}

然后实现一个工厂:

class ParserFactory {
    public static IDocumentParser GetParserForFilename(string filename) {
        /*
           This is the simple way. A more complex yet elegant way would be for all parsers to include a property exposing the filetypes it supports, and they are loaded through reflection or dependency injection.
        */
        switch (Path.GetExtension(fileName))
            {
                case ".txt":
                {
                    return new TextFileParser();
                }
                // add additional parsers here
            }
            return null;
    }
}

并使用:

IDocumentParser parser = ParserFactory.GetParserForFilename(file.FileName);
string content = parser.GetContent(file);

这称为“控制反转”。