构造函数中包含多个参数的最佳实践
本文关键字:最佳 参数 包含多 构造函数 | 更新日期: 2023-09-27 18:25:25
如果我有一个视图需要访问5个不同的存储库,我现在正在这样做:
public class MyClass
{
private readonly IRepo1 rep1;
private readonly IRepo2 rep2;
...
public MyClass(IRepo1 r1, IRepo2 r2, IRepo3 r3, IRepo4 r4...)
{
rep1 = r1;
rep2 = r2;
re3 = r3;
}
}
这种方法的问题是构造函数变得越来越大,如果构造函数中有什么变化,我必须在整个系统中编辑变化。如何避免这个问题?
我考虑创建一个构建器类,负责创建存储库并将其解析为视图。或者这是一个糟糕的方法?
您可以使所有存储库接口都派生自基本接口IRepositoryBase
,然后将IEnumerable<IRepositoryBase>
传递给构造函数。
此外,由于您的存储库最终以某种方式由MyClass
处理,因此它们可能有一些共同的功能;您还可以在IRepositoryBase
中为这个通用功能添加方法,然后MyClass
就可以完成它的工作,而不需要知道它正在处理的存储库的实际类型。
示例代码:
public class MyClass
{
private readonly IRepositoryBase[] repos;
public MyClass (IEnumerable<IRepositoryBase> r)
{
repos = r.ToArray();
}
// ...
}
您可以使用构建器模式初始化MyClass
实例:
MyClassBuilder.cs:
public class MyClassBuilder {
IRepo1 rep1;
IRepo2 rep2;
IRepo3 rep3;
IRepo4 rep4;
// ...
public MyClassBuilder() {
}
public MyClassBuilder setRepo1(IRepo1 rep1) {
this.rep1 = rep1;
return this;
}
public MyClassBuilder setRepo2(IRepo2 rep1) {
this.rep2 = rep2;
return this;
}
public MyClassBuilder setRepo3(IRepo3 rep3) {
this.rep3 = rep3;
return this;
}
public MyClassBuilder setRepo4(IRepo4 rep4) {
this.rep4 = rep4;
return this;
}
// ...
public MyClass build() {
return new MyClass(
rep1 ?? DEFAULT_REP1,
rep2 ?? DEFAULT_REP2,
rep3 ?? DEFAULT_REP3,
rep4 ?? DEFAULT_REP4
// ...
);
}
}
示例用法:
MyClass myclass = new MyClassBuilder()
.setRepo1(new Repo1(/*...*/))
.setRepo4(new Repo4(/*...*/))
.build();