c# – 如何在GetInstance调用/备用解决方案后在Simple Injector中进行注册?

请考虑以下示例:
public class CommunicationClient : IClient
{
    public CommunicationClient(IServerSettings settings) { ... }
    // Code         
}

public class SettingsManager : ISettingsManager
{
    SettingsManager(IDbSettingManager manager)

    // Code
    public IDictionary<string,string> GetSettings() { ... }
}

问题:
在执行注册(使用SimpleInjector)时,我需要提供从SetingsManager实例获取的值并填充ServerSettings实例(IServerSettings的具体类型)但是如果我调用GetInstance< ISettingsManager>在注册CommunicationClient之前,它给了我一个我无法做到的错误
错误:
首次调用GetInstance,GetAllInstances和Verify后,无法更改容器.)

一种解决方案可能是将ISettingsManager作为依赖项注入CommunicationClient,但我真的不想传递它,因为它会提供超过所需信息.

编辑:集装箱登记

container.Register(typeof(ICommunicationClient),typeof(CommunicationClient));
ISettingsManager settingsManager = container.GetInstance<ISettingsManager>();

string url = settingsManager.GetSetting("url");
string userName = settingsManager.GetSetting("username");
string password = settingsManager.GetSetting("password");

container.Register(typeof(IServerConfiguration),() => 
      new ServerConfiguration(url,userName,password);

有关如何以更清洁的方式实现上述目标的任何建议/替代解决方案?谢谢.

解决方法

Simple Injector在首次使用后锁定容器以进行进一步更改.这是一个明确的设计选择,描述为 here.这意味着在调用GetInstance后无法调用Register,但绝不应该有理由这样做.或者换句话说,您的配置总是可以以您不需要的方式重写.在您的情况下,您的配置可能如下所示:
var settingsManager = new SettingsManager(new SqlSettingManager("connStr"));

container.RegisterSingle<ISettingsManager>(settingsManager);
container.Register<ICommunicationClient,CommunicationClient>();

string url = settingsManager.GetSetting("url");
string userName = settingsManager.GetSetting("username");
string password = settingsManager.GetSetting("password");

container.Register<IServerConfiguration>(() => 
      new ServerConfiguration(url,password));

在那里,您看到SettingsManager不是由容器构建的.使用DI容器时,不需要让DI容器为您构建每个实例.让容器自动连线实例可以降低Composition Root的维护负担,并且可以更轻松地将横切关注点(例如使用装饰器)应用于相关类组.对于SettingsManager和SqlSettingsManager类,它们的构造函数不太可能经常更改它会增加Composition Root的维护负担.因此,手动创建一次这些实例非常好.

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...