2015-04-29 2 views
2

У меня есть интерфейс IBreakfastProvider, который имеет несколько реализаций. В настоящее время мой код решает, какой из них использовать на основе id. Он использует заводской метод, например:Методы фабрики в Ninject C#

public IBreakfastProvider GetBreakfastProvider(int id) 
{ 
    switch (id) 
    { 
     case 1: 
      return new CornFlakeProvider(new SomeDependency()); 
     case 2: 
      return new MuesliProvider(new SomeOtherDependency()); 
     case 3: 
      return new ToastProvider(); 
     default: 
      throw new ApplicationException("Unknown provider id."); 
    } 
} 

Каждая реализация поставщика IBreakfast может иметь свои собственные зависимости. Как можно заменить этот метод, чтобы использовать Ninject для разработки, какую реализацию использовать на основе этого целочисленного id?

ответ

0

Вы можете зарегистрировать каждый тип с именем. Затем, когда вам нужно решить, просто передать id в Ninject:

// Use better naming though :) 
kernel.Bind<IBreakfastProvider>().To<CornFlakeProvider>().Named("1"); 

А потом, когда вы постановляю:

var breakfastProvider = resolutionRoot.Get<IFoo>(id); 
+0

и вместо того, чтобы делать ' resolution.Get (id); 'вы также можете использовать [эту функцию Ninject.Extensions.Factory] (https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface%3A-Referencing-Named -Bindings) – BatteryBackupUnit

0

Встраиваться конструктор:

public class BreakfastProviderFactory 
{ 
    private readonly CornFlakeProvider provider1; 
    private readonly MuesliProvider provider2; 
    private readonly ToastProvider provider3; 

    public BreakfastProviderFactory(CornFlakeProvider provider1, 
     MuesliProvider provider2, ToastProvider provider3) { 
    { 
     this.provider1 = provider1; 
     this.provider2 = provider2; 
     this.provider3 = provider3; 
    } 

    public IBreakfastProvider GetBreakfastProvider(int id) 
    { 
     switch (id) 
     { 
      case 1: return this.provider1; 
      case 2: return this.provider2; 
      case 3: return this.provider3; 
      default: throw new ApplicationException("Unknown provider id."); 
     } 
    } 
} 
Смежные вопросы