依赖注入,don';I don’我不知道把方法放在哪里
本文关键字:don 我不知道 方法 在哪里 注入 依赖 | 更新日期: 2023-09-27 18:28:40
我创建了一个ILogger
接口和一个实现ILogger
的ListViewLogger
类,现在ILogger
有一个不应该存在的方法(SetListViewReference
),因为不是所有的Logger都会登录到ListView,我不知道该把它放在哪里,因为我正在进行依赖注入我需要那个方法,那么我该怎么办?谢谢
using System;
using System.Windows.Forms;
namespace AutoTweet
{
public interface ILogger
{
void Log(string text);
void SetListViewReference(ListView listview);
}
public class ListViewLogger : ILogger
{
private ListView _lvLog;
public void Log(string text)
{
_lvLog?.Items.Add(makeLvi(text));
}
public void SetListViewReference(ListView listview)
{
_lvLog = listview;
}
private ListViewItem makeLvi(string text)
{
ListViewItem ret = new ListViewItem { Text = DateTime.Now.ToString() };
ret.SubItems.Add(text);
return ret;
}
}
}
有一个新的IListViewLogger
接口,它将继承自ILogger
,并具有附加方法:
public interface ILogger
{
void Log(string text);
}
public interface IListViewLogger : ILogger
{
void SetListViewReference(ListView listview);
}
public class ListViewLogger : IListViewLogger
{
//...
}
不过,设计实际上取决于ListView的范围。
如果应用程序中只有一个ListView,那么它应该设置在组合根目录中的某个位置,因为您知道记录器的具体类型,所以可以在那里进行设置。如果范围是按视图的,那么拥有这个扩展接口是非常好的,因为您需要以某种方式告诉记录器它应该登录到哪里。
如果您想从ILogger
接口中删除对UI控件的依赖,可以应用依赖反转原则。一种方法是向接口添加一个event
。为了简单起见,我不介绍另一个界面,即:
interface ILogger
{
void Log(string msg);
event Action<string> LogMessages;
}
class PublisherLogger : ILogger
{
public event Action<string> LogMessages = (msg) => { };
public void Log(string msg)
{
Console.WriteLine(msg);
LogMessages(msg);
}
}
然后在Form
控件中使用:
public Form1()
{
InitializeComponent();
var publisherLogger = new PublisherLogger(); //or inject it
publisherLogger.LogMessages += msg =>
{
//add msg to list view
ListViewItem item = new ListViewItem { Text = DateTime.Now.ToString() };
item.SubItems.Add(text);
_listView.Items.Add(ret);
};
}
您还可以提取setup代码,将ListView
和LogMessage
连接到一个扩展方法中,以使事情更加干燥。
旁注:DIP与DI不同