我将使用无状态服务类,并在每个方法调用中传递静态类的状态信息。在不知道您的课程的任何细节的情况下,我将仅用 ac# 静态类展示另一个示例。
public static class LegacyCode
{
public static void Initialize(int p1, string p2)
{
//some static state
}
public static void ChangeSettings(bool p3, double p4)
{
//some static state
}
public static void DoSomething(string someOtherParam)
{
//execute based on some static state
}
}
public class LegacyCodeFacadeService
{
public void PerformLegacyCodeActivity(LegacyCodeState state, LegacyCodeParams legacyParams)
{
lock (_lockObject)
{
LegacyCode.Initialize(state.P1, state.P2);
LegacyCode.ChangeSettings(state.P3, state.P4);
LegacyCode.DoSomething(legacyParams.SomeOtherParam);
//do something to reset state, perhaps
}
}
}
您必须稍微填写一些空白,但希望您能明白这一点。关键是在所需的最少时间内在静态对象上设置状态,并在整个时间内锁定对它的访问,因此其他调用者不会受到全局状态更改的影响。您必须创建此类的新实例才能使用它,因此它是完全可注入和可测试的(提取接口的步骤除外,为简洁起见,我跳过了该步骤)。
这里有很多实现选项。例如,如果您必须对 LegacyCodeState 进行大量更改,但仅更改为少数特定状态,则可以使用重载来管理这些状态。
编辑
这在很多方面都比单例更可取,最重要的是,您将无法累积并耦合到全局状态:如果它是静态类的唯一入口点,这会将全局状态转换为非全局状态. 但是,如果您最终需要一个单例,您可以通过在此处封装构造函数来轻松切换。
public class LegacyCodeFacadeService
{
private LegacyCodeFacadeService() { }
public static LegacyCodeFacadeService GetInstance()
{
//now we can change lifestyle management strategies later, if needed
return new LegacyCodeFacadeService();
}
public void PerformLegacyCodeActivity(LegacyCodeState state, LegacyCodeParams legacyParams)
{
lock (_lockObject)
{
LegacyCode.Initialize(state.P1, state.P2);
LegacyCode.ChangeSettings(state.P3, state.P4);
LegacyCode.DoSomething(legacyParams.SomeOtherParam);
//do something to reset state, perhaps
}
}
}