将在应用程序中的许多 类 中访问和更新的对象的良好做法?
Good practices for an object that will be accessed & updated in many classes in an application?
我有一个每分钟 运行 一次的应用程序。完成后,应用程序将在退出前写入日志 table。此对象紧密映射日志 table:
class SendResult
{
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public TimeSpan ExecutionTime { get
{
return EndTime - StartTime;
}
public bool RequestChecked{ get; set; }
public int RequestID { get; set; }
public bool RequestRequiresFileSend { get; set; }
public bool FilesRead { get; set; }
public bool FilesSent { get; set; }
public SendResult() { }
}
每个 属性 将在应用程序的不同位置更新。我通过一次声明对象并将其设为静态来实现此目的:
class Program
{
public static SendResult Result;
public Program()
{
Result = new SendResult();
Result.StartTime = DateTime.Now;
// do stuff...
Result.EndTime = DateTime.Now;
LogUtility.Log(Result);
}
}
..在整个应用程序中,我只是调用:
Program.Result.FilesRead = ...
我知道另一种方法是围绕 SendResult 构建应用程序,如下所示:
SendResult result = new SendResult();
result.StartTime = DateTime.Now;
var request = new RequestHandler().CheckRequest();
result.RequestChecked = request.Checked;
result.RequestID = request.RequestID;
result.RequestRequiresFileSend = request.FileSendRequired;
var sendResult = new FileSender(request.ResuestID).Send();
result.FilesRead = sendResult.FilesRead;
// ...and so on
但是如果您必须在编写完所有代码之后插入此结果跟踪,有没有比我使用的全局 var 方法更好的方法?
总结为 "do stuff" 的代码部分应该将 SendResult
实例作为一个依赖项,或者明确地推入它们,或者可能以某种方式解决,而不是直接依赖于访问Program
中的静态字段。您可以使用构造函数参数、对象属性或方法参数直接传递引用。可以使用 IoC/DI container. The idea is to reduce coupling 实现间接方法,这在大多数情况下是个好主意。
您的应用程序可能会受益于使用 Pipes and Filters Architectural Pattern,但前提是您有可扩展性和灵活性要求。否则,引入的复杂性会对您的特定情况适得其反。
静态变量通常不是一个好主意,在依赖注入的现代应用程序中几乎没有使用它们。它的使用添加了一个状态并增加了耦合,使其变得更加复杂,例如单独对所有组件进行单元测试。
所以最简单的方法是只创建所需的对象并将其发送到所有需要编辑的方法。虽然一般来说有点难说,但最好是你的所有方法都 return 它们自己的对象,这些对象后来组合成结果对象并保存到数据库中。
但是虽然可以有不同的策略来实现您想要的,但使用静态变量很可能不是最好的。
我有一个每分钟 运行 一次的应用程序。完成后,应用程序将在退出前写入日志 table。此对象紧密映射日志 table:
class SendResult
{
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public TimeSpan ExecutionTime { get
{
return EndTime - StartTime;
}
public bool RequestChecked{ get; set; }
public int RequestID { get; set; }
public bool RequestRequiresFileSend { get; set; }
public bool FilesRead { get; set; }
public bool FilesSent { get; set; }
public SendResult() { }
}
每个 属性 将在应用程序的不同位置更新。我通过一次声明对象并将其设为静态来实现此目的:
class Program
{
public static SendResult Result;
public Program()
{
Result = new SendResult();
Result.StartTime = DateTime.Now;
// do stuff...
Result.EndTime = DateTime.Now;
LogUtility.Log(Result);
}
}
..在整个应用程序中,我只是调用:
Program.Result.FilesRead = ...
我知道另一种方法是围绕 SendResult 构建应用程序,如下所示:
SendResult result = new SendResult();
result.StartTime = DateTime.Now;
var request = new RequestHandler().CheckRequest();
result.RequestChecked = request.Checked;
result.RequestID = request.RequestID;
result.RequestRequiresFileSend = request.FileSendRequired;
var sendResult = new FileSender(request.ResuestID).Send();
result.FilesRead = sendResult.FilesRead;
// ...and so on
但是如果您必须在编写完所有代码之后插入此结果跟踪,有没有比我使用的全局 var 方法更好的方法?
总结为 "do stuff" 的代码部分应该将 SendResult
实例作为一个依赖项,或者明确地推入它们,或者可能以某种方式解决,而不是直接依赖于访问Program
中的静态字段。您可以使用构造函数参数、对象属性或方法参数直接传递引用。可以使用 IoC/DI container. The idea is to reduce coupling 实现间接方法,这在大多数情况下是个好主意。
您的应用程序可能会受益于使用 Pipes and Filters Architectural Pattern,但前提是您有可扩展性和灵活性要求。否则,引入的复杂性会对您的特定情况适得其反。
静态变量通常不是一个好主意,在依赖注入的现代应用程序中几乎没有使用它们。它的使用添加了一个状态并增加了耦合,使其变得更加复杂,例如单独对所有组件进行单元测试。
所以最简单的方法是只创建所需的对象并将其发送到所有需要编辑的方法。虽然一般来说有点难说,但最好是你的所有方法都 return 它们自己的对象,这些对象后来组合成结果对象并保存到数据库中。
但是虽然可以有不同的策略来实现您想要的,但使用静态变量很可能不是最好的。