我正试着看看我是否理解了依赖注入。
我有一个用作解析器的项目。它可以解析分隔文本,键值以及正则表达式。
这样做的第一种方法是使用开关的一个功能。 下一个方法是将它放在单独的函数中并根据开关调用它
我想的另一种方法是创建一个接口,而不是为每种类型实现一个类。那要做多少工作?这个问题是否起作用,或者这样做会显示出我尚未看到的好处。
我相信我的问题源于我最初要实现一个接口而不是每次我需要一个不同的解析器实现一个新类。但是,这仍然需要我进入并将其添加到某种类型的逻辑流程中,因为我没有看到如何使用注入框架来做到这一点。
所以说我添加了另一种基于标签或xml解析的方法。创建实现接口的类,而不是我需要将它们添加到流逻辑中,以便在用户选择解析该类型的文本时将它们实例化为该接口。有任何明确的方法吗?
答案 0 :(得分:3)
我认为你真正需要的是工厂。工厂是一个知道,如果有一些信息可以处理,如何创建必要的适当类型的对象。在您的情况下,您将创建一个解析器接口,然后分离实现各种解析器的类。最后,创建一个解析器工厂,它具有一定的能力来告诉创建哪种解析器,创建并返回所需的类型。这就是你的逻辑。工厂提供了一种本地化创建项目的创建逻辑的方法。
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." );
}
}
其他一些人建议使用插件模型,如果合适,可以调整工厂以读取插件配置,加载相应的插件,并根据需要创建实例类型。在这种情况下,将工厂视为“经理”可能更合适,因为它不仅仅是创建实例。
答案 1 :(得分:2)
我会说你走在正确的轨道上,但你有点不对劲。你应该去Factory Method和Visitor patern的方向,先解决解析问题。
这项工作可能对您有意义 - http://www.exciton.cs.rice.edu/research/sigcse05/dp4rdp.pdf
答案 2 :(得分:2)
您所描述的内容仅与依赖注入远程连接。然而,它是替换条件与多态性 Refactoring(第255页)的海报示例,所以这绝对是一个好主意。
如果你决定完全放弃有条件而只是将策略注入消费者,它就会变成DI。
答案 3 :(得分:0)
我使用抽象工厂模式实现了文件解析器。 我的工厂只是要求文件扩展,并根据使用策略(或切换案例)我决定实例化哪个解析器。