我创建了一个ILogger
接口和一个实现ListViewLogger
的{{1}}类,现在ILogger
有一个方法(ILogger
)不应该在那里,因为不是所有记录器都会记录到ListView,我不知道在哪里放置它,因为我正在做依赖注入我需要那个方法,所以我该怎么办?谢谢!
SetListViewReference
答案 0 :(得分:1)
拥有一个新的IListViewLogger
接口,该接口将继承ILogger
并具有其他方法:
public interface ILogger
{
void Log(string text);
}
public interface IListViewLogger : ILogger
{
void SetListViewReference(ListView listview);
}
public class ListViewLogger : IListViewLogger
{
//...
}
设计实际上取决于ListView的范围。
如果应用程序中只有一个ListView,则应将其设置在组合根目录中的某个位置,您可以在其中设置它,因为您知道记录器的具体类型。如果范围是每个视图,那么拥有这个扩展接口是完全没问题的,因为你需要以某种方式告诉记录器它应该在哪里登录。
答案 1 :(得分:1)
如果您想从event
界面删除对UI控件的依赖,您可以应用dependency inversion principle。一种方法是在界面中添加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);
};
}
控件中使用它:
ListView
您还可以提取设置代码,将LogMessage
附加到{{1}}到扩展方法中,以使事情更加干燥。