Aur*_*Aur 5 c# parsing dependency-injection text-parsing
我想看看我是否理解依赖注入。
我有一个用作解析器的项目。它可以解析分隔文本、键值和正则表达式。
这样做的第一种方法是在一个带有开关的功能中。下一个方法是将它放在单独的函数中并基于 switch 调用它
我想的下一个方法是创建一个接口,然后为每种类型实现一个类。工作量很大吗?问题是否归结为功能或这样做会显示我还没有看到的好处。
我相信我的问题源于我最初打算实现一个接口,而不是每次我需要不同的解析实现一个新类。但除此之外,仍然需要我进入并将其添加到某种类型的逻辑流中,因为我不知道如何使用注入框架来做到这一点。
所以说我添加了另一种基于标签或xml的解析方式。创建实现接口的类,如果用户选择解析该类型的文本,我需要将它们添加到流逻辑以将它们实例化为该接口。有没有更清楚的方法来做到这一点?
我认为你真正需要的是工厂。工厂是一个类,在给定一些要处理的信息的情况下,它知道如何创建所需的正确类型的对象。在您的情况下,您将创建一个解析器接口,然后创建实现各种解析器的单独类。最后,创建一个解析器工厂,赋予它一些能力来告诉创建哪种解析器,创建并返回所需的种类。这就是你的逻辑所在。Factory 提供了一种本地化所创建项目的创建逻辑的方法。
public interface IParser<T>
{
T Parse<T>( string item );
}
public class KeyValueParser : IParser<KeyValue>
{
KeyValuePair Parse<KeyValue>( string item );
}
...
public class ParserFactory
{
public IParser<T> CreateParser<T>()
{
var type = typeof(T);
if (type == typeof(KeyValuePair))
{
return new KeyValueParser();
}
...
throw new InvalidOperationException( "No matching parser type." );
}
}
Run Code Online (Sandbox Code Playgroud)
其他一些人建议了一个插件模型,如果合适的话,工厂可以适应读取插件配置,加载适当的插件,并根据需要创建实例类型。在这种情况下,将工厂视为“管理器”可能更合适,因为它不仅仅是创建实例。