Подтвердить что ты не робот

Реальные примеры кода ASP.NET MVC, реорганизованные для инъекций зависимостей с использованием Ninject

Доброе утро!

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

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

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

4b9b3361

Ответ 1

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

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

Перед

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 онлайн-провайдерами и двумя автономными провайдерами. В CreateKernel вы можете выбрать логику для проверки базы данных, файла конфигурации и т.д., Чтобы определить, какой провайдер должен зарегистрироваться. Например, может быть, одна служба объявила 24 часа простоя (надеюсь, вам повезло, что это объявлено!), Поэтому за это время вы хотите перейти на другой интернет-провайдер, для которого вы внедрили экземпляр IOnlineSpellService