C# 依赖注入

C# 依赖注入,c#,parsing,dependency-injection,text-parsing,C#,Parsing,Dependency Injection,Text Parsing,我想看看我是否理解依赖性注射 我有一个用作解析器的项目。它可以解析分隔文本、键值和正则表达式 第一种方法是在一个带有开关的函数中完成。 下一种方法是将它放在单独的函数中,并基于开关调用它 我想的下一个方法是创建一个接口,然后为每种类型实现一个类。那要花很多工夫吗?问题是否归结到功能上,或者这样做是否会显示出我还没有看到的好处 我相信我的问题源于我最初打算实现一个接口,而不是每次我需要一个不同的解析来实现一个新的类。但是,这仍然需要我进入并将其添加到某种类型的逻辑流中,因为我不知道如何使用注入框架

我想看看我是否理解依赖性注射

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

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

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

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


假设我添加了另一种基于标记或xml的解析方法。创建实现接口的类,然后我需要将它们添加到流逻辑中,以便在用户选择解析该类型的文本时将它们实例化为该接口。有更清晰的方法吗?

我想你真正需要的是一个工厂。工厂是一个类,它知道在给定一些信息的情况下,如何创建所需的适当类型的对象。在您的例子中,您需要创建一个解析器接口,然后分离实现各种解析器的类。最后,创建一个解析器工厂,如果能够告诉您要创建哪种类型的解析器,它将创建并返回所需的类型。这就是你的逻辑。工厂提供了一种为正在创建的项本地化创建逻辑的方法

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." );
    }
}
公共接口IParser
{
T解析(字符串项);
}
公共类KeyValueParser:IParser
{
KeyValuePair解析(字符串项);
}
...
公共类解析器工厂
{
公共IParser CreateParser()
{
var类型=类型(T);
if(type==typeof(KeyValuePair))
{
返回新的KeyValueParser();
}
...
抛出新的InvalidOperationException(“没有匹配的解析器类型”);
}
}

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

我想说你走对了,但你有点错。您应该按照工厂方法和访问者模式的方向,首先解决解析问题

  • 处理不同类型输入的访问者
  • 访问者是通过思想工厂的方法创建的
  • 工厂作为构造函数注入,实现依赖注入模式 这项工作对你来说可能很有趣-

    您所描述的只是远程连接到依赖项注入。然而,这是Replace-Conditional-with-polymorphics(第255页)的一个海报示例,所以这绝对是一个好主意


    只有当您决定完全取消条件,而是将策略注入消费者时,它才会变成DI

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

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