考虑以下示例:
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(使用前将#替换为@)