asp.net-mvc – 使用Ninject重构依赖注入的ASP.NET MVC代码的实例

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 使用Ninject重构依赖注入的ASP.NET MVC代码的实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
早上好!

昨天我看了Tekpub的惊人的视频“Dependency Injection and Inversion of Control”,这让我想起了.我觉得这是我应该如何编写代码.我之前已经看过,甚至尝试了Ninject一点点,但是觉得我需要一些更多的代码重构这个范例的例子.

他进行的简短的MUD示例是伟大的,但有人知道一个网站或项目,他们从一些丑陋,但工作,代码,然后将其重构为干净的依赖注入代码

虽然我可以很容易地找到使用Dependency Injection的代码示例,但我很难在代码之前/之后找到代码,我觉得这样会大大帮助我开始编写“在下一个级别”.我需要更多的例子来真正包围我的头.

解决方法

假设你想实现拼写纠正服务.输入一个单词/短语,并弹出一个更正版本的单词/短语.如果你依赖一家大型的在线供应商,一天下来怎么办?理想情况下,如果对提供程序的请求失败,您将执行备份.在该备份中,您可以调用您的辅助服务,并希望他们在线.也许在最后的沟通努力中,如果它们都处于关闭状态,则您实现一个脱机提供程序,以根据文件系统上存在的本地字典更正拼写错误.

你如何管理这样的多个提供商?

之前

  1. public class SpellCheck
  2. {
  3. public string FixText(string text)
  4. {
  5. string CorrectedText = string.Empty;
  6. // create HTTP request to Online Provider #1
  7. // return CorrectedText;
  8. }
  9. }

  1. public class SpellCheck
  2. {
  3. private readonly IOnlineSpellService _onlineSpell;
  4. private readonly IOfflineSpellService _offlineSpell;
  5.  
  6. public SpellCheck(IOnlineSpellService onlineSpell,IOfflineSpellService offlineSpell)
  7. {
  8. this._onlineSpell = onlineSpell;
  9. this._offlineSpell = offlineSpell;
  10. }
  11.  
  12. // same method as before,just a slightly different implementation
  13. public string FixText(string text)
  14. {
  15. string fixedText = _onlineSpell.FixText(text);
  16. if(_onlineSpell.Failed)
  17. fixedText = _offlineSpell.FixText(text);
  18.  
  19. return fixedText;
  20. }
  21. }

当然,您需要实现ISpellOnlineService接口(和ISpellOfflineService类似的接口)

  1. public interface ISpellOnlineService
  2. {
  3. public bool Failed { get; set; }
  4. public string FixText(string text);
  5. }

接下来,实现您的拼写提供商(在线和离线,甚至是两个实例,以获得更多的灵活性)

  1. public class OnlineProviderNo1 : IOnlineSpellService
  2. {
  3. public string FixText(string text)
  4. {
  5. // implement online logic
  6. this.Failed = false;
  7. }
  8. }

最后,通过覆盖CreateKernel方法并从NinjectHttpApplication子类化您的MvcApplication注册您的服务.并且显然与Ninject替换Application_Start一个称为OnApplicationStarted的重写,如下所示:

**这是在global.asax中完成的

  1. public class MvcApplication : NinjectHttpApplication
  2. {
  3. // ...
  4.  
  5. protected override void OnApplicationStarted()
  6. {
  7. base.OnApplicationStarted();
  8.  
  9. AreaRegistration.RegisterAllAreas();
  10. RegisterGlobalFilters(GlobalFilters.Filters);
  11. RegisterRoutes(RouteTable.Routes);
  12. }
  13.  
  14. protected override IKernel CreateKernel()
  15. {
  16. var kernel = new StandardKernel();
  17. kernel.Bind<IOnlineSpellService>().To<OnlineProviderNo1>();
  18. kernel.Bind<IOfflineSpellService>().To<OfflineProviderNoX>();
  19.  
  20. return kernel;
  21. }
  22. }

是的,这是一个真实世界的例子,我已经实现了它(我实际上使用了城堡温莎,但是与Ninject相同的概念 – 刚刚适应了上面),有3个在线提供商和2个离线提供商.在CreateKernel中,您可以选择包含检查数据库,配置文件等的逻辑来确定要注册的提供者.例如,也许一个服务已经宣布了24小时的停机时间(希望你很幸运能够宣布!),所以在那段时间你想切换到另一个在线提供商,你已经实现了一个IOnlineSpellService的实例

猜你在找的asp.Net相关文章