依赖注入:应该注入什么?

时间:2011-08-02 19:43:02

标签: c# dependency-injection

我有许多类,包含能够写入CSV或XML文件的功能。 为此,我将StreamWriter或XmlWriter的实例传递给ToCsv或ToXml方法。

public class HandFeed : JobItem
{
    // Snip

    public override void ToCsv(StreamWriter writer)
    {
        if (writer != null)
        {
            writer.WriteLine(JobItemsStrings.Job_HandFeed);
            writer.WriteLine(JobItemsStrings.Job_Total + SEPARATOR_CHAR + this.Total.ToString());
        }
    }

    public override void ToXml(XmlWriter writer)
    {
        if (writer != null)
        {
            writer.WriteStartElement("handfeed");
            writer.WriteElementString("total", this.Total.ToString());
            writer.WriteEndElement();
        }
    }
}

现在我也想为JSON提供支持,如果我以同样的方式继续,这将意味着在“ToJson”或类似的行中为我的所有类添加另一种方法。

嗯,这感觉就像是错误的。我想的可能是反过来做事情并将类的实例传递给不同的文件编写器对象,但不确定这是否正确,或者甚至是如何最好地完成它。

也许我可以传入一个界面并拨打Write()?这个感觉就像它会更正确一样,但同样,如何将其付诸实践。

所以,我的问题简而言之:

  • 这些课程应该“注入”作家吗?
  • 某些作家是否应该“注入”这些课程?
  • 坚持使用当前设置,但改为创建某种形式的界面?

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

您可以编写符合接口并注入编写器的“编写器”。但是,这意味着给定对象只能在任何单个状态下写入单个格式。这对您来说可能不是问题,如果不是,这是一个实用的方法。

另一个选择是创建符合接口的编写器,但将对象从写出自己的业务中删除。相反,一些调用者可以设置编写器并将对象传递给它。这与我刚才回答的问题有关:

Should classes be able to save and load themselves via XML?

在您的情况下,希望写出来的调用者可以通过一些能够解析正确编写者的工厂获得“编写者”。

我不会坚持您当前的设置,因为正如您所提到的,每次需要新格式时,您都需要修改现有代码并添加该格式的方法。此外,您告诉您的对象他们应该知道如何做太多。

答案 1 :(得分:0)

我认为您需要应用仆人设计模式,您可以在此link

上阅读