Ali*_*Ali 6 c# ioc-container simple-injector
请考虑以下示例:
public class CommunicationClient : IClient
{
public CommunicationClient(IServerSettings settings) { ... }
// Code
}
public class SettingsManager : ISettingsManager
{
SettingsManager(IDbSettingManager manager)
// Code
public IDictionary<string, string> GetSettings() { ... }
}
Run Code Online (Sandbox Code Playgroud)
问题:在执行注册(使用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);
Run Code Online (Sandbox Code Playgroud)
有关如何以更清洁的方式实现上述目标的任何建议/替代解决方案?谢谢.
Simple Injector在首次使用后锁定容器以进行进一步更改.这是一个明确的设计选择,在此处进行描述.这意味着您在打电话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));
Run Code Online (Sandbox Code Playgroud)
在那里你看到SettingsManager容器没有建立起来.使用DI容器时,不需要让DI容器为您构建每个实例.让容器自动连线实例可以降低组合根的维护负担,并且可以更轻松地将横切关注点(例如使用装饰器)应用于相关类组.对于SettingsManager和SqlSettingsManager类,它们的构造函数不太可能经常改变它会增加Composition Root的维护负担.因此,手动创建一次这些实例非常好.
| 归档时间: |
|
| 查看次数: |
3529 次 |
| 最近记录: |