首页 > 解决方案 > 避免重写派生类的构造函数?

问题描述

我有 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 类的构造函数参数列表,以便新 Service 的属性 UserName类被分配为其他先前的服务类。此外,必须将一个新的服务类类型属性添加到基类中(我知道我无法避免在基类中添加这样一个新的服务类属性)。我必须重写 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
        {

        }
    }

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

标签: c#oop

解决方案


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

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

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


推荐阅读