昨天我看了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的实例