C# 依赖注入(inject)

标签 c# parsing dependency-injection text-parsing

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

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

完成此操作的第一种方法是在一个带有开关的函数中。 下一个方法是将它放在单独的函数中并根据开关调用它

我想到的下一个方法是创建一个接口(interface),而不是为每种类型实现一个类。这是很多工作吗?问题是否归结为功能或这样做会显示我还没有看到的好处。

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

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

最佳答案

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

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." );
    }
}

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

关于C# 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5284627/

相关文章:

c# - 加快 SQL Server 2008 中 185k 行的更新?

c# - 从 Oracle 数据库表填充 DataTable - C#

parsing - 水平马尔可夫化

c# - 在 Unity 中使用抽象工厂作为注入(inject)工厂?

c# - 如何从 tiff 图像中裁剪一部分

python - 使用 ElementTree 在 python 中解析 xml

java - 解析 SOAP 响应返回 null

java - 使用基于注解的配置创建延迟初始化的 Spring bean

java - Dagger:POJO 中的字段注入(inject)

c# SetCompatibleTextRenderingDefault 必须在第一个之前调用