我在将DI与构造函数属性一起使用时遇到问题。我正在基于我的PDFBuilder建立一个IPDFBuilder

public interface IPDFBuilder
{
    string templatefilepath { get; }
    string templatefilename { get; }
    Dictionary<string, string> dict { get; }
    void CreatePDF();
}

public class PDFBuilder : IPDFBuilder
{
    public string templatefilename { get; private set; }
    public string templatefilepath { get; private set; }
    public Dictionary<string, string> dict { get; private set; }

    public PDFBuilder(string templatefilename, string templatefilepath, Dictionary<string, string> dict)
    {
        this.templatefilename = templatefilename;
        this.templatefilepath = templatefilepath;
        this.dict = dict;
    }

    public void CreatePDF() {
        //Do something
    }
}


PDFBuilder可以并且将在多个控制器中使用,例如:

public class KeuringController : Controller
{
    private IPDFBuilder _PDFBuilder;
    public KeuringController(IPDFBuilder pdfBuilder)
    {
        _PDFBuilder = pdfBuilder;
    }
    //Action methods that use `PDFBuilder` below...
}


但是,我无法在启动类(完成DI注册的启动类)中设置PDFBuilder的属性,因为不同的控制器将对PDFBuilder类的属性使用不同的值。一种简单的解决方案是仅公开属性的设置器,以便在操作方法中可以设置值,然后调用CreatePDF()。但是,这感觉不对。另一个简单的解决方案是删除类属性,然后将PDFBuilder的3个属性作为方法属性传递给CreatePDF方法,如下所示:

public void CreatePDF(string templatefilename, string templatefilepath, Dictionary<string, string> dict) {
        //Do something
    }


但是现在让我们说我的PDFBuilder谁有10个方法,都需要这3个属性。那这不是正确的解决方案吧?

那么正确的解决方案是什么?我在使用不同的类/接口实现时多次遇到此问题,并希望在这些情况下的设计有所帮助。

最佳答案

您正在将运行时数据注入到组件的构造函数(即bad thing)中。解决方案是将这些运行时值从构造函数中移出到CreatePDF方法中:

public interface IPDFBuilder
{
    void CreatePDF(string templatefilepath, string templatefilename,
        Dictionary<string, string> dict);
}

08-19 03:51