我遇到了递归依赖的问题(.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”)
设置和记录器是单身人士
如何使用DI容器解决Logger和Settings之间的递归依赖关系? 它有可能吗?
我有一个遗留的架构,没有任何DI容器正常工作,它只是初始化Logger的实例,然后读取设置,然后通过“Initialize”方法设置ProducerConnectionString值(并且此方法也会发送存储的消息在内存中,而生产者没有初始化)。 但我想使用DI容器(Microsoft.Extensions.DependencyInjection),我不明白它是如何实现的。在我看来这是不可能的,我必须从SettingsClient类中以某种方式删除Logger实例。
有什么想法吗?建议?