c# - 避免重写派生类的构造函数?
问题描述
我有 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
{
}
}
我的问题:当基类的构造函数中添加了新的服务类时,如何避免修改派生类的构造函数?
解决方案
解决这个问题的唯一方法是不要使用构造函数来定义你的依赖。一些依赖注入框架,如 AutoFac 支持属性注入。
这样您就不需要构造函数来设置依赖项,而是依赖注入框架负责为您设置依赖项属性。
这样做的缺点是,如果您在没有依赖注入框架的情况下创建实例,或者您不初始化属性注入,那么您“必须知道”,您必须设置依赖属性,因为没有强制的构造函数你来设置它们。
推荐阅读
- spring - 如何使用 Spring 的 WebTestClient 检查 Kotlin 中的字符串?
- android - 在android中添加一个新库
- python - Django 计算运行平衡
- android - 为 OneTimeWorkRequest 多次调用 WorkManager 的 doWork()
- python - 如何根据特定值减少/组合数据框中的行?
- c - xbee ansi C 库端点示例
- node.js - expressjs 路由器获取:id 多级
- java - Swing - 如何将我的应用程序限制为屏幕大小
- android - 颤振热重载不起作用。需要帮助
- ios - WKWebView 不会打开 @click 侦听器并从 Vue.js 的图标重定向