我在将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);
}