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 个属性。那么这不是正确的解决方案吗?
那么正确的解决方案是什么?我在不同的类/接口实现中多次遇到过这个问题,并希望在这些情况下的设计方面得到一些帮助。
您将运行时数据注入到组件的构造函数中,这是一件坏事。解决方案是将这些运行时值从构造函数中移到CreatePDF
方法中:
public interface IPDFBuilder
{
void CreatePDF(string templatefilepath, string templatefilename,
Dictionary<string, string> dict);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
744 次 |
最近记录: |