使用动态构造函数注入的 DI

Kip*_* ei 2 c# dependency-injection constructor-injection

我在使用带有构造函数属性的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

public void CreatePDF(string templatefilename, string templatefilepath, Dictionary<string, string> dict) {
        //Do something
    }
Run Code Online (Sandbox Code Playgroud)

但是现在假设我PDFBuilder有 10 个方法,它们都需要这 3 个属性。那么这不是正确的解决方案吗?

那么正确的解决方案是什么?我在不同的类/接口实现中多次遇到过这个问题,并希望在这些情况下的设计方面得到一些帮助。

Ste*_*ven 6

您将运行时数据注入到组件的构造函数中,这是一件坏事。解决方案是将这些运行时值从构造函数中移到CreatePDF方法中:

public interface IPDFBuilder
{
    void CreatePDF(string templatefilepath, string templatefilename,
        Dictionary<string, string> dict);
}
Run Code Online (Sandbox Code Playgroud)