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() { ... } } 问题: 一种解决方案可能是将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的维护负担.因此,手动创建一次这些实例非常好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |