Dan*_*abo 2 .net c# class-library winforms
我在构建我应该做的事情上有些麻烦,以促进我的类库和使用它的程序之间的通信 - 在这种情况下,Windows Forms应用程序:
// 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();
}
}
Run Code Online (Sandbox Code Playgroud)
由于在winforms应用程序中没有任何内容监听控制台,因此对log()的调用不会显示任何内容.有没有办法动态覆盖Foo.Log方法,或者可能将具有该签名的方法分配给更适合运行时表单应用程序的Foo对象?
谢谢!
声明一个记录器接口并将具体的记录器注入库类
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...");
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它
var foo = new Foo(new ConsoleLogger());
var foo = new Foo(new FileLogger());
var foo = new Foo(new MsgBoxLogger());
Run Code Online (Sandbox Code Playgroud)
所有这些记录器都实现了接口.
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
正如Mike Panter已经指出的那样,你可以使用一个代表
public class Foo
{
private Action<string> _writeLog;
public Foo (Action<string> writeLog)
{
_writeLog = writeLog;
}
public void DoWork ()
{
_writeLog("Working...");
}
}
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它
var foo = new Foo(s => Console.WriteLine(s));
Run Code Online (Sandbox Code Playgroud)
代表注入的优点
请参阅Jon Skeets的文章The Beauty of Closures for variables capture.
接口注入的优点
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |