asp.net-mvc - 使用 Ninject 重构依赖注入(inject)的 ASP.NET MVC 代码的真实示例

标签 asp.net-mvc dependency-injection refactoring inversion-of-control ninject

早上好!

昨天我看了 Tekpub 的精彩视频 "Dependency Injection and Inversion of Control"这让我大吃一惊。我觉得这就是我应该如何编写代码。我之前看过它,甚至尝试过一点 Ninject,但感觉我需要更多一些代码示例来重构到这个范例中。

他所介绍的简短的 MUD 示例很棒,但是有人知道有一个网站或项目吗?他们从一些丑陋但有效的代码开始,然后将其重构为干净的依赖注入(inject)代码?

虽然我可以很容易地找到使用依赖注入(inject)的代码示例,但我很难找到之前/之后的代码,我觉得这将极大地帮助我开始“下一个级别”的编程。我需要更多的例子来真正理解它。

最佳答案

假设您想要实现拼写更正服务。输入单词/短语,然后弹出该单词/短语的正确版本。如果您依赖的大型在线提供商有一天宕机了怎么办?理想情况下,您应该实现备份,以防向所述提供商的请求失败。在该备份中,您可以调用辅助服务并希望他们在线。也许在它们都宕机的情况下,您可以实现一个离线提供程序来根据文件系统上存在的本地字典来纠正拼写。

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

之前

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;
    }
}

当然,您需要实现接口(interface) ISpellOnlineService (以及类似的界面 ISpellOfflineService

public interface ISpellOnlineService
{
    public bool Failed { get; set; }
    public string FixText(string text);
}

接下来,实现您的拼写提供程序(在线和离线,甚至两者的多个实例以获得更大的灵 active )

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;
    }
}

是的,这是一个现实世界的例子,因为我已经通过 3 个在线提供商实现了它(我实际上使用了 CaSTLe Windsor,但它与 Ninject 的概念相同 - 只是在上面进行了调整) 2 个离线提供商。在 CreateKernel您可以选择包含逻辑来检查数据库、配置文件等以确定要注册的提供程序。例如,也许一项服务已宣布 24 小时停机(希望您足够幸运,能够宣布这一消息!),因此在此期间,您希望切换到已实现 IOnlineSpellService 实例的另一个在线提供商。

关于asp.net-mvc - 使用 Ninject 重构依赖注入(inject)的 ASP.NET MVC 代码的真实示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6227259/

相关文章:

c# - 如何将参数传递给 Controller ​​构造函数?这是正确的做法吗?

c# - UserStore 每个 HttpRequest 的 Unity IoC 生命周期

c# - 了解 Ninject mvc 3 样板代码

asp.net-mvc - Knockout 和 MVC3 : Posting JSON to action, 序列化两次?无法转换为 C# 对象?

asp.net-mvc - 用于轻量级内容编辑的 MVC 5 自定义 HtmlHelper

c# - 模型或ViewModel中的MVVM计算字段?

javascript - Gulp uglify 导致 AngularJS 无法解决提供者问题

用于重命名/移动的 Python 重构工具

c# - 使用 ReSharper 将方法提取到现有接口(interface)

c++ - C++ 代码的单元测试 - 工具和方法