【问题标题】:Avoid re-writing constructors of derived classes? [duplicate]避免重写派生类的构造函数? [复制]
【发布时间】:2019-03-30 12:55:39
【问题描述】:

我有 3 个(不包括服务类)C# 类及其构造函数,它们以使用 依赖注入 的方式编写(我正在使用 Microsoft Unity DI 框架)如下:

public class BaseClass
{
    public ServiceClass1 Sc1 {get;set;}
    public ServiceClass2 Sc2 {get; set;}

    public BaseClass(
           ServiceClass1 sc1,
           ServiceClass2 sc2
    )
    {
       Sc1 = sc1;
       Sc2 = sc2;

       // assign C# Session value to property UserEmail for all Service classes that are passed in the Base class contructor
      SC1.UserEmail = (string) Session["UserEmail"];
      SC2.UserEmail = (string) Session["UserEmail"];
    }


}

public class DerivedClass1: BaseClass
{
    public DerivedClass1 (
           ServiceClass1 sc1,
           ServiceClass2 sc2
    ): base(sc1, sc2)
    {

    }
}

public class DerivedClass2: BaseClass
{
    public DerivedClass2 (
           ServiceClass1 sc1,
           ServiceClass2 sc2
    ): base(sc1, sc2)
    {

    }
}

问题是每当有一个新的Service类被使用时,它必须被添加到Base类的构造函数参数列表中,并且Derived类的构造函数参数列表需要更新,以便属性UserName的新的服务类被分配为其他先前的服务类。此外,必须将一个新的 Service 类类型属性添加到 Base 类(我知道我无法避免在 Base 类中添加这样一个新的 Service 类属性)。我必须重写 Base 和 Re 类的构造函数,如下所示

public class BaseClass
    {
        public ServiceClass1 Sc1 {get;set;}
        public ServiceClass2 Sc2 {get; set;}
        public ServiceClass3 Sc3 {get; set;} // added property

        public BaseClass(
               ServiceClass1 sc1,
               ServiceClass2 sc2,
               ServiceClass3 sc3 // added constructor parameter
        )
        {
           Sc1 = sc1;
           Sc2 = sc2;
           Sc3 = sc3; // added code line

           // assign C# Session value to property UserEmail for all Service classes that are passed in the Base class contructor
          SC1.UserEmail = (string) Session["UserEmail"];
          SC2.UserEmail = (string) Session["UserEmail"];
          Sc3.UserEmail = (string) Session["UserEmail"]; // added code line
        }


    }

    public class DerivedClass1: BaseClass
    {
        public DerivedClass1 (
               ServiceClass1 sc1,
               ServiceClass2 sc2,
               ServiceClass3 sc3 // added parameter
        ): base(sc1, sc2, sc3) // re-write passing arguments
        {

        }
    }

    public class DerivedClass2: BaseClass
    {
        public DerivedClass2 (
               ServiceClass1 sc1,
               ServiceClass2 sc2,
               ServiceClass3 sc3 // added parameter
        ): base(sc1, sc2, sc3) // re-write passing arguments
        {

        }
    }

我的问题:当基类的构造函数中添加了新的服务类时,如何避免修改派生类的构造函数?

【问题讨论】:

  • 您可以定义一个包含所有服务的超级服务,因此您只需要传递超级服务的实例。也不要忘记注册超级服务。
  • This post 有一个很好的解释/例子来处理这个问题(类似于@Vlad 提到的超级服务)

标签: c# oop


【解决方案1】:

解决这个问题的唯一方法是不要使用构造函数来定义你的依赖。一些依赖注入框架,如 AutoFac 支持 property injection

这样您就不需要构造函数来设置依赖项,而是依赖注入框架会为您设置依赖项属性。

这样做的缺点是,如果您在没有依赖注入框架的情况下创建实例,或者您不初始化属性注入,那么您“必须知道”,您必须设置依赖属性,因为没有强制你设置它们的构造函数。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2013-06-23
  • 2011-10-10
  • 2021-07-15
相关资源
最近更新 更多