递归依赖

时间:2017-12-04 14:56:08

标签: c# .net dependency-injection .net-core

我遇到了递归依赖的问题(.Net Core 2)。 我有以下课程

public interface ISettings
{
    string GetValue(string key);
}
public class Settings : ISettings
{
    internal Settings(Dictionary<string,string> values)
    {
        _items = values;
    }
    Dictionary<string, string> _items;
    public string GetValue(string key)
    {
        return _items[key];
    }
}

用于从字典中读取设置数据。 下一个是

public interface ISettingsClient
{
    Dictionary<string, string> GetSettings();
}
public class SettingsClient: ISettingsClient
{
    internal SettingsClient(ILogger logger)
    {
        _logger = logger;
    }
    ILogger _logger;

    public Dictionary<string, string> GetSettings()
    {
        _logger.Log("log something");
        //read settings from the service
        return new Dictionary<string, string>() { { "key", "value" } };
    }
}

用于从第三方服务获取设置值, 此客户端使用了看起来像这样的Logger实例

public interface ILogger
{
    void Log(string message);
}
public interface IProducer
{
    void Send<T>(T message);
}
public class Logger:ILogger
{
    internal Logger(string producerConnectionString)
    {
        _producer = new Producer(this, producerConnectionString);
    }
    IProducer _producer;

    public void Log(string message)
    {
        _producer.Send(message);
    }
}
public class Producer:IProducer
{
    public Producer(ILogger logger, string connectionString)
    {
        _logger = logger;
    }

    ILogger _logger;

    public void Send<T>(T message)
    {
        Console.WriteLine("send message");
    }
}

Logger正在使用Producer实例将消息发送到队列 和connectionString = settings.GetValue(“ProducerConnectionstring”)

  • 初始化我需要初始化SettingsClient的设置
  • 初始化SettingsClient我需要一个ILogger实例
  • 初始化ILogger我需要从Settings
  • 中读取“ProducerConnectionString”值

设置和记录器是单身人士

如何使用DI容器解决Logger和Settings之间的递归依赖关系? 它有可能吗?

我有一个遗留的架构,没有任何DI容器正常工作,它只是初始化Logger的实例,然后读取设置,然后通过“Initialize”方法设置ProducerConnectionString值(并且此方法也会发送存储的消息在内存中,而生产者没有初始化)。 但我想使用DI容器(Microsoft.Extensions.DependencyInjection),我不明白它是如何实现的。在我看来这是不可能的,我必须从SettingsClient类中以某种方式删除Logger实例。

有什么想法吗?建议?

0 个答案:

没有答案