[英]C# Create Global instance of a Static Class
I have inherited a base of code, and I am looking to do a small change without a lot of refactoring for some static functions in a class to be able to use with configuration information. 我已经继承了代码库,并且我希望做一个小的更改,而无需大量重构类中的某些静态函数就可以与配置信息一起使用。
My issue is that there is a static class that has functions for interacting with the console. 我的问题是,有一个静态类具有与控制台进行交互的功能。 These static functions can then simply be called using the Console.Write() notation. 然后可以使用Console.Write()表示法简单地调用这些静态函数。 The problem I have is I need to put some configuration changes into the static class based on command line options passed to the main program. 我的问题是我需要根据传递给主程序的命令行选项对静态类进行一些配置更改。
While I would normally use Dependency Injection to support this, the code base does not have an instance of this class being passed to objects that use it. 虽然我通常使用依赖注入来支持此功能,但是代码库中没有将该类的实例传递给使用它的对象。 I need to configure a setting in the static class at runtime to control how the functions in the class work. 我需要在运行时在静态类中配置一个设置,以控制该类中的功能如何工作。
I am at a loss on how to do this with C# (and other languages) without doing the larger change to support dependency injection. 我对如何使用C#(和其他语言)执行此操作不知所措,而没有进行较大的更改以支持依赖项注入。
Short Sample of the static class access 静态类访问的简短示例
public class ConsoleUtilities
{
public static string ApplicationVersion
{
get
{
Assembly MyProgram = Assembly.GetEntryAssembly();
return MyProgram.GetName().Version.ToString();
}
}
/// <summary>
/// Show Text on the screen, and optionally write to LogPathFileName
/// </summary>
/// <param name="HelpText">Text to show</param>
/// <param name="LogPathFileName">Path and File Name of LogFile to write to. Use "" to not Log</param>
public static void ShowText(string[] HelpText, string LogPathFileName)
{
foreach (string HelpLine in HelpText)
{
ShowText(HelpLine, System.ConsoleColor.Gray, System.ConsoleColor.Black, LogPathFileName);
}
}
public static void ShowText(string HelpLine, System.ConsoleColor Foreground, System.ConsoleColor Background, string LogPathFileName)
{
ShowTextOnConsole(HelpLine, Foreground, Background, true, LogPathFileName);
}
}
Sample Program using the static class 使用静态类的示例程序
public class Program
{
public enum EXIT_CODES { OK = 0, CONFIG_ERROR, FILE_ERROR, COMPARE_ERROR, EXECUTION_ERROR, WARNING };
public const string LogPathFileName = "Tool.log";
static int Main(string[] args)
{
int ApplicationExitCode = (int)EXIT_CODES.OK;
int Failures = 0;
string[] AboutText = {
"Tool.exe - " + CSharpUtilities.ConsoleUtilities.ApplicationVersion,
"Copyright (c) 2014",
""
};
Settings AppSettings = new Settings(AboutText);
// Ensure Command Line is valid before proceeding
ApplicationExitCode = (int)EXIT_CODES.CONFIG_ERROR;
ApplicationCommandLine AppCommandLine = new ApplicationCommandLine();
try
{
if (AppCommandLine.ParseCommandLine(args))
{
// Load Application Settings
LoadApplicationSettings(ref AppSettings, AppCommandLine);
ConsoleUtilities.ShowText(AboutText, LogPathFileName);
List<string> ValidationErrors = ValidateApplicationSettings(AppSettings);
if (ValidationErrors.Count == 0)
{
...
}
else
{
ConsoleUtilities.ShowText(ValidationErrors.ToArray(), LogPathFileName);
}
}
}
catch (Exception e)
{
ApplicationExitCode = (int)EXIT_CODES.EXECUTION_ERROR; // Exception occured in processing. Fail the program execution.
string[] SystemError = { "System Error", e.Message.ToString() };
ConsoleUtilities.ShowText(SystemError, LogPathFileName);
}
}
}
You can put static fields in the static class, and initialize them in your program after parsing the command line. 您可以将静态字段放在静态类中,然后在解析命令行后在程序中对其进行初始化。 For example: 例如:
public class ConsoleUtilities
{
public static bool ShowLog { get; set; } = true; // true, if we want log messages to be printed
public static void Log(string[] HelpText, string LogPathFileName)
{
if (ShowLog) {
foreach (string HelpLine in HelpText)
{
ShowText(HelpLine, System.ConsoleColor.Gray, System.ConsoleColor.Black, LogPathFileName);
}
}
}
} }
And then when parsing command line somewhere in your code you would use 然后在代码中解析命令行时,您将使用
ConsoleUtilities.ShowLog = true; // or false
You can expose the configuration as a static field or property : 您可以将配置公开为静态字段或属性:
public class ConsoleUtilities
{
public static string ApplicationVersion
{
get
{
Assembly MyProgram = Assembly.GetEntryAssembly();
return MyProgram.GetName().Version.ToString();
}
}
public static ConsoleConfiguration Configuration = new ConsoleConfiguration();
/// <summary>
/// Show Text on the screen, and optionally write to LogPathFileName
/// </summary>
/// <param name="HelpText">Text to show</param>
/// <param name="LogPathFileName">Path and File Name of LogFile to write to. Use "" to not Log</param>
public static void ShowText(string[] HelpText, string LogPathFileName)
{
foreach (string HelpLine in HelpText)
{
ShowText(HelpLine, Configuration.BackgroundColor, Configuration.ForegroundColor, LogPathFileName);
}
}
public static void ShowText(string HelpLine, System.ConsoleColor Foreground, System.ConsoleColor Background, string LogPathFileName)
{
ShowTextOnConsole(HelpLine, Foreground, Background, true, LogPathFileName);
}
}
public class ConsoleConfiguration
{
public ConsoleColor ForegroundColor { get; set; }
public ConsoleColor BackgroundColor { get; set; }
public ConsoleConfiguration()
{
ForegroundColor = ConsoleColor.Gray;
BackgroundColor = ConsoleColor.Black;
}
}
And you can reconfigurate like : 您可以像这样重新配置:
ConsoleUtilities.Configuration.ForegroundColor = ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.