Реальные примеры кода ASP.NET MVC, реорганизованного для внедрения зависимостей с использованием Ninject - PullRequest
12 голосов
/ 03 июня 2011

Доброе утро!

Вчера я смотрел потрясающее видео Tekpub «Внедрение зависимостей и инверсия контроля» , и оно взорвало мой разум. Я чувствую, что это то, как я должен писать код. Я смотрел его раньше и даже немного экспериментировал с Ninject, но чувствую, что мне нужно еще несколько примеров рефакторинга кода в эту парадигму.

Краткий пример MUD, в который он входит, великолепен, но кто-нибудь знает сайт или проект, где они начинают с какого-то уродливого, но работающего кода, а затем преобразуют его в чистый код с добавленной зависимостью?

Хотя я могу довольно легко найти примеры кода, в котором используется Dependency Injection, мне трудно найти код до и после, и я чувствую, что это очень помогло бы мне начать программировать «на следующем уровне». Мне нужно еще несколько примеров, чтобы действительно обернуть голову вокруг него.

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

Предположим, вы хотите внедрить службу исправления орфографии.Введите слово / фразу и выскочит исправленную версию слова / фразы.Что делать, если вы зависели от крупного интернет-провайдера, который отказался в течение дня.В идеале вы должны создать резервную копию на случай, если запрос к указанному провайдеру не будет выполнен.В этой резервной копии вы можете позвонить в службу поддержки и надеяться, что они в сети.Возможно, в последнем случае, если они оба не работают, вы внедрите автономного поставщика для исправления орфографии на основе локального словаря, который существует в файловой системе.

Как вы управляете несколькими поставщиками, как это?

До

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 и подклассифицируя ваше MvcApplication из NinjectHttpApplication. И, очевидно, с помощью 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;
    }
}

Да, это пример реального мира , как я его реализовал (на самом деле я использовал Castle Windsor, но это та же концепция, что и в Ninject - только что адаптированная выше) с3 налинейные провайдеры и 2 офлайн провайдера.В CreateKernel вы можете включить логику для проверки базы данных, файла конфигурации и т. Д., Чтобы определить, какого поставщика следует зарегистрировать.Например, возможно, одна служба объявила о 24-часовом простое (надеюсь, вам повезло, что объявили об этом!), Поэтому в течение этого времени вы хотите переключиться на другого интернет-провайдера, для которого вы внедрили экземпляр IOnlineSpellService

4 голосов
/ 03 июня 2011

Серия MVC StoreFront охватывает внедрение зависимостей с использованием StructureMap. Проект запускается без IoC и добавляет его позже в эпизоде ​​№ 13: ASP.NET MVC Storefront Часть 13: Внедрение зависимостей

...