gpt4 book ai didi

c# - 如何从类库进行通信

转载 作者:行者123 更新时间:2023-11-30 19:11:53 24 4
gpt4 key购买 nike

我在概念化我应该做什么来促进我的类库和使用它的程序之间的通信时遇到了一些麻烦——在本例中,是一个 Windows 窗体应用程序:

// Class in library
class Foo()
{
public Foo(){}

public void DoWork()
{
log("Working...");
}

private void log( string s )
{
Console.Writeline(s);
}

}

// Forms App
class Form1()
{
public Form1()
{
Foo MyFoo = new Foo();
MyFoo.DoWork();
}
}

由于在 winforms 应用程序中没有监听控制台,因此调用 log() 不会显示任何内容。有没有办法动态覆盖 Foo.Log 方法,或者可能将具有该签名的方法分配给运行时更适合表单应用程序的 Foo 对象?

谢谢!

最佳答案

声明一个记录器接口(interface)并将具体的记录器注入(inject)库类

public interface ILogger
{
void Log(string message);
}

public class Foo
{
private ILogger _logger;

public Foo (ILogger logger)
{
_logger = logger;
}

public void DoWork ()
{
_logger.Log("Working...");
}
}

这样使用

var foo = new Foo(new ConsoleLogger());
var foo = new Foo(new FileLogger());
var foo = new Foo(new MsgBoxLogger());

所有这些记录器实现接口(interface)的地方。

public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}

更新

正如 Mike Panter 已经指出的,您可以使用委托(delegate)

public class Foo
{
private Action<string> _writeLog;

public Foo (Action<string> writeLog)
{
_writeLog = writeLog;
}

public void DoWork ()
{
_writeLog("Working...");
}
}

你可以这样调用它

var foo = new Foo(s => Console.WriteLine(s));

委托(delegate)注入(inject)的优点

  • 申报非常简单
  • 使用起来非常简单
  • 您可以通过变量捕获传递额外的参数。

参见 Jon Skeets 的文章 The Beauty of Closures用于变量捕获。

接口(interface)注入(inject)的优点

  • 您可以通过其构造函数轻松地将参数传递给记录器,例如 FileLogger 的文件名。由于构造函数不是接口(interface)的一部分,不同的记录器可以有不同的构造函数参数。
  • 您可以使用单元测试轻松地对其进行测试,这是您无法使用匿名 lambda 表达式执行的操作,因为无法从单元测试中访问它们。
  • 您可以在库类的单元测试中使用模拟记录器。
  • 您可以通过从现有记录器派生来创建新的专用记录器。
  • 您可以在记录器中声明私有(private)辅助方法。

关于c# - 如何从类库进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com