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的实例 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ValidateInput属性似乎无法在ASP.NET MVC中工作
- asp.net-mvc-3 – ASP.NET MVC 3,动作过滤器和Autofac依赖注
- asp.net – 避免使用CORS进行预检OPTIONS请求
- ASP.NET Web API应用程序中的Autofac多租户IoC容器
- asp.net – 如何从SQL表中的列获取XML数据?
- asp.net-mvc-3 – 如何使用Asp.Net MVC 3和Razor具有视图特
- iis – ASP / ASP.NET处理写权限的最佳方法是什么?
- asp.net-mvc – 什么是ASP.Net MVC查看引擎?
- 看美剧英文字幕学英语的利器深蓝英文字幕助手简介
- asp.net-mvc – EF映射对象不兼容的数据读取器异常
- nTier应用程序中的.Net会员资格
- 什么是文字控制用于和asp.net的标签控制有什么区
- asp.net-core – ASP .NET Core默认语言总是英文
- asp.net-mvc-3 – 可以添加到显示/ EditorTempla
- asp.net-mvc – 如何告诉Ninject绑定到它没有引用
- asp.net – 在Azure Web App中设置EF连接字符串
- asp.net – Visual Studio 2013更改现有项目的身
- asp.net-mvc – ASP.NET MVC流畅的nNibernate,Io
- 什么是asp.net会话超时的单位?
- ASP.NET和System.Diagnostics跟踪 – 我错过了什
