繁体   English   中英

构造函数中有许多参数的最佳实践?

[英]Best practice with many parameters in constructor?

如果我有一个需要访问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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM