加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 22:47:38 所属栏目:asp.Net 来源:网络整理
导读:早上好! 昨天我看了Tekpub的惊人的视频“Dependency Injection and Inversion of Control”,这让我想起了.我觉得这是我应该如何编写代码.我之前已经看过,甚至尝试了Ninject一点点,但是觉得我需要一些更多的代码重构这个范例的例子. 他进行的简短的MUD示例是
早上好!

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读