C# 中使用 Action<bool> 委托的构造函数注入
Constructor Injection with Action<bool> delegate in C#
问题是我需要在某些句柄 class 和某些控制台应用程序之间注入依赖项(构造函数依赖项)。
控制台应用程序有状态 isRunning,这显然是 bool 变量。我可以从控制台应用程序调用 exit 命令,然后出现问题。由于 bool 是值类型,当我们将它作为构造函数参数传递给某些 class,然后更改它在 class 中的值时,控制台应用程序的状态不会不改变。所以我需要注入依赖。
我有这样的代码。
private static class Program
{
private static bool isRunning = true;
private static void Main(string[] args)
{
...
var exitHandler = new ExitHandler(isRunning);
do
{
exitHandler.Exit();
}
while (isRunning);
}
}
...
public class ExitHandler
{
...
private readonly Action<bool> applicationState;
...
public void Exit();
}
我知道我们可以将 bool 值包装到 class 中,而不是将其作为参数传递,但不知何故,它可以通过 Action 委托来完成。 问题是怎么做?
一个动作可以“捕获”一个局部变量或字段。所以这很简单:
internal class Program
{
static bool isRunning = true;
static void Main(string[] args)
{
var exitHandler = new ExitHandler(() => isRunning = false) ;
do
{
exitHandler.Exit();
}
while (isRunning);
}
}
public class ExitHandler
{
Action onExit;
public ExitHandler(Action onExit)
{
this.onExit = onExit;
}
public void Exit() => onExit();
}
在我看来,您可以使用 CancellationTokenSource
internal class Program
{
static void Main(string[] args)
{
var exitHandler = new CancellationTokenSource();
do
{
exitHandler.Cancel();
}
while (!exitHandler.IsCancellationRequested);
}
}
它更简单,而且线程安全。
问题是我需要在某些句柄 class 和某些控制台应用程序之间注入依赖项(构造函数依赖项)。 控制台应用程序有状态 isRunning,这显然是 bool 变量。我可以从控制台应用程序调用 exit 命令,然后出现问题。由于 bool 是值类型,当我们将它作为构造函数参数传递给某些 class,然后更改它在 class 中的值时,控制台应用程序的状态不会不改变。所以我需要注入依赖。 我有这样的代码。
private static class Program
{
private static bool isRunning = true;
private static void Main(string[] args)
{
...
var exitHandler = new ExitHandler(isRunning);
do
{
exitHandler.Exit();
}
while (isRunning);
}
}
...
public class ExitHandler
{
...
private readonly Action<bool> applicationState;
...
public void Exit();
}
我知道我们可以将 bool 值包装到 class 中,而不是将其作为参数传递,但不知何故,它可以通过 Action 委托来完成。 问题是怎么做?
一个动作可以“捕获”一个局部变量或字段。所以这很简单:
internal class Program
{
static bool isRunning = true;
static void Main(string[] args)
{
var exitHandler = new ExitHandler(() => isRunning = false) ;
do
{
exitHandler.Exit();
}
while (isRunning);
}
}
public class ExitHandler
{
Action onExit;
public ExitHandler(Action onExit)
{
this.onExit = onExit;
}
public void Exit() => onExit();
}
在我看来,您可以使用 CancellationTokenSource
internal class Program
{
static void Main(string[] args)
{
var exitHandler = new CancellationTokenSource();
do
{
exitHandler.Cancel();
}
while (!exitHandler.IsCancellationRequested);
}
}
它更简单,而且线程安全。