【问题标题】:C# Dependency InjectionC# 依赖注入
【发布时间】:2011-07-14 04:00:06
【问题描述】:

我想看看我是否理解依赖注入。

我有一个用作解析器的项目。它可以解析分隔文本、键值和正则表达式。

第一种方法是在一个带有开关的函数中。 下一个方法是把它放在单独的函数中,并基于一个开关调用它

我想到的下一个方法是创建一个接口,然后为每种类型实现一个类。工作量大吗?问题是否归结为功能,或者这样做会显示我还没有看到的好处。

我相信我的问题源于我最初打算实现一个接口,而不是每次我需要不同的解析实现一个新类。但除此之外,我仍然需要将其添加到某种类型的逻辑流程中,因为我不知道如何使用注入框架来做到这一点。

所以说我添加了另一种基于标签或xml的解析方式。创建实现接口的类,如果用户选择解析该类型的文本,我需要将它们添加到流逻辑中以将它们实例化为该接口。有更清晰的方法吗?

【问题讨论】:

  • 我不太确定这与依赖注入有什么关系,我认为最类似于您所说的概念是MEF
  • 我同意,MEF或其他一些插件模型

标签: c# parsing dependency-injection text-parsing


【解决方案1】:

我认为您真正需要的是工厂。工厂是一个类,在给定一些信息的情况下,它知道如何创建必要的适当类型的对象。在您的情况下,您将创建一个解析器接口,然后将实现各种解析器的类分开。最后,创建一个解析器工厂,给它一些能力来判断要创建哪种解析器,创建并返回所需的类型。这就是您的逻辑所在。 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." );
    }
}

其他一些人建议了一个插件模型,如果合适的话,工厂可以适应读取插件配置,加载适当的插件,并根据需要创建实例类型。在这种情况下,将工厂视为“经理”可能更合适,因为它不仅仅是创建实例。

【讨论】:

    【解决方案2】:

    我会说你在正确的轨道上,但你有点错了。您应该按照工厂方法和访问者模式的方向,首先解决解析问题。

    1. 处理不同类型输入的访问者。
    2. 访问者是通过工厂方法创建的。
    3. 工厂作为构造函数注入完成依赖注入模式。

    这项工作可能会让你感兴趣—— http://www.exciton.cs.rice.edu/research/sigcse05/dp4rdp.pdf

    【讨论】:

      【解决方案3】:

      您所描述的只是远程连接到依赖注入。然而,它是 Replace Conditional with Polymorphism Refactoring(第 255 页)的海报示例,因此绝对是一个好主意。

      只有当你决定完全放弃条件,而是将策略注入消费者时,它才会成为 DI。

      【讨论】:

        【解决方案4】:

        我已经使用抽象工厂模式实现了一个文件解析器。 而我的工厂只要求文件扩展名,并根据使用策略(或切换案例)决定要实例化哪个解析器。

        【讨论】:

          猜你喜欢
          • 2013-05-27
          • 1970-01-01
          • 2010-12-26
          • 2010-09-26
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          相关资源
          最近更新 更多