asp.net-mvc – 使用Ninject重构依赖注入的ASP.NET MVC代码的实
早上好!
昨天我看了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的实例 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-4 – MVC 4 – Web Api和JSON?
- asp.net – Model-View-Presenter,View的界面属于
- asp.net-mvc – 在ASP.NET MVC中,使用@RenderSec
- asp.net-mvc – knockout下拉列表将选择传递给MV
- asp.net-mvc – MVC视图| *你如何*处理IsAuthent
- asp.net – 插入后在实体框架中获取记录ID
- ASP.NET MVC – 将XHTML添加到验证错误消息中
- 如何测量Live ASP.NET MVC Web应用程序的内存使用
- asp.net – 如何使用.net用户控件创建Umbraco内容
- ASP.Net(IIS 7.5)查询没有用户凭据的Active Dire