Предположим, вы хотите внедрить службу исправления орфографии.Введите слово / фразу и выскочит исправленную версию слова / фразы.Что делать, если вы зависели от крупного интернет-провайдера, который отказался в течение дня.В идеале вы должны создать резервную копию на случай, если запрос к указанному провайдеру не будет выполнен.В этой резервной копии вы можете позвонить в службу поддержки и надеяться, что они в сети.Возможно, в последнем случае, если они оба не работают, вы внедрите автономного поставщика для исправления орфографии на основе локального словаря, который существует в файловой системе.
Как вы управляете несколькими поставщиками, как это?
До
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