在 GetInstance 调用/替代解决方案之后如何在简单注入器中进行注册?

2024-01-13

考虑以下示例:

public class CommunicationClient : IClient
{
    public CommunicationClient(IServerSettings settings) { ... }
    // Code         
}

public class SettingsManager : ISettingsManager
{
    SettingsManager(IDbSettingManager manager)

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

Problem: 执行注册时(使用SimpleInjector),我需要提供从实例获得的值SetingsManager并填充ServerSettings实例(具体类型为IServerSettings)但是如果我打电话GetInstance<ISettingsManager>注册前CommunicationClient,它给了我一个错误,我不能这样做
Error: 第一次调用 GetInstance、GetAllInstances 和 verify 后,容器将无法更改。)

一种解决方案可能是注入ISettingsManager作为对的依赖CommunicationClient但我真的不想通过它,因为它会提供超出所需的信息。

EDIT:集装箱注册

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);

关于如何以更清洁的方式实现上述目标有什么建议/替代解决方案吗?谢谢。


简单注射器会在首次使用后锁定容器以进行进一步更改。这是一个明确的设计选择,描述为here https://simpleinjector.readthedocs.org/en/latest/decisions.html#container-is-locked。这意味着您无法调用Register在你打电话之后GetInstance,但绝不应该有理由这样做。或者换句话说,您的配置始终可以以您不需要的方式重写。在您的情况下,您的配置可能如下所示:

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, userName, password));

在那里你看到了SettingsManager不是由容器构建的。使用 DI 容器时,您不需要让 DI 容器为您构建每个实例。让容器为您自动连接实例是为了减轻您的维护负担成分根 http://blog.ploeh.dk/2011/07/28/CompositionRoot/并且可以更轻松地将横切关注点(例如使用装饰器)应用于相关类组。在这种情况下SettingsManager and SqlSettingsManager类,它们的构造函数不太可能经常更改,这会增加组合根的维护负担。因此,手动创建这些实例一次是完全可以的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GetInstance 调用/替代解决方案之后如何在简单注入器中进行注册? 的相关文章

随机推荐