昨天我看了Tekpub的惊人的视频“Dependency Injection and Inversion of Control”,这让我想起了.我觉得这是我应该如何编写代码.我之前已经看过,甚至尝试了Ninject一点点,但是觉得我需要一些更多的代码重构这个范例的例子.
他进行的简短的MUD示例是伟大的,但有人知道一个网站或项目,他们从一些丑陋,但工作,代码,然后将其重构为干净的依赖注入代码?
虽然我可以很容易地找到使用Dependency Injection的代码示例,但我很难在代码之前/之后找到代码,我觉得这样会大大帮助我开始编写“在下一个级别”.我需要更多的例子来真正包围我的头.
解决方法
你如何管理这样的多个提供商?
之前
- public class SpellCheck
- {
- public string FixText(string text)
- {
- string CorrectedText = string.Empty;
- // create HTTP request to Online Provider #1
- // return CorrectedText;
- }
- }
后
- public class SpellCheck
- {
- private readonly IOnlineSpellService _onlineSpell;
- private readonly IOfflineSpellService _offlineSpell;
- public SpellCheck(IOnlineSpellService onlineSpell,IOfflineSpellService offlineSpell)
- {
- this._onlineSpell = onlineSpell;
- this._offlineSpell = offlineSpell;
- }
- // same method as before,just a slightly different implementation
- public string FixText(string text)
- {
- string fixedText = _onlineSpell.FixText(text);
- if(_onlineSpell.Failed)
- fixedText = _offlineSpell.FixText(text);
- return fixedText;
- }
- }
当然,您需要实现ISpellOnlineService接口(和ISpellOfflineService类似的接口)
- public interface ISpellOnlineService
- {
- public bool Failed { get; set; }
- public string FixText(string text);
- }
接下来,实现您的拼写提供商(在线和离线,甚至是两个实例,以获得更多的灵活性)
- public class OnlineProviderNo1 : IOnlineSpellService
- {
- public string FixText(string text)
- {
- // implement online logic
- this.Failed = false;
- }
- }
最后,通过覆盖CreateKernel方法并从NinjectHttpApplication子类化您的MvcApplication注册您的服务.并且显然与Ninject替换Application_Start一个称为OnApplicationStarted的重写,如下所示:
**这是在global.asax中完成的
- public class MvcApplication : NinjectHttpApplication
- {
- // ...
- protected override void OnApplicationStarted()
- {
- base.OnApplicationStarted();
- AreaRegistration.RegisterAllAreas();
- RegisterGlobalFilters(GlobalFilters.Filters);
- RegisterRoutes(RouteTable.Routes);
- }
- protected override IKernel CreateKernel()
- {
- var kernel = new StandardKernel();
- kernel.Bind<IOnlineSpellService>().To<OnlineProviderNo1>();
- kernel.Bind<IOfflineSpellService>().To<OfflineProviderNoX>();
- return kernel;
- }
- }
是的,这是一个真实世界的例子,我已经实现了它(我实际上使用了城堡温莎,但是与Ninject相同的概念 – 刚刚适应了上面),有3个在线提供商和2个离线提供商.在CreateKernel中,您可以选择包含检查数据库,配置文件等的逻辑来确定要注册的提供者.例如,也许一个服务已经宣布了24小时的停机时间(希望你很幸运能够宣布!),所以在那段时间你想切换到另一个在线提供商,你已经实现了一个IOnlineSpellService的实例