【发布时间】: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 提到的超级服务)