依赖注入,don';I don’我不知道把方法放在哪里

本文关键字:don 我不知道 方法 在哪里 注入 依赖 | 更新日期: 2023-09-27 18:28:40

我创建了一个ILogger接口和一个实现ILoggerListViewLogger类,现在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;
        }
    }
}

依赖注入,don';I don’我不知道把方法放在哪里

有一个新的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代码,将ListViewLogMessage连接到一个扩展方法中,以使事情更加干燥。

旁注:DIP与DI不同