依赖注入,不知道放置方法的位置

时间:2016-01-02 16:38:49

标签: c# dependency-injection interface

我创建了一个ILogger 接口和一个实现ListViewLogger的{​​{1}}类,现在ILogger有一个方法(ILogger )不应该在那里,因为不是所有记录器都会记录到ListView,我不知道在哪里放置它,因为我正在做依赖注入我需要那个方法,所以我该怎么办?谢谢!

SetListViewReference

2 个答案:

答案 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}}到扩展方法中,以使事情更加干燥。

旁注:DIP is not the same as DI