2015-07-30 1 views
0

Я пытаюсь воспроизвести приведенную ниже конфигурацию Windsor на Ninject. Я знаю, что ninject имеет заводское расширение, но он далеко от адаптера словаря, который имеет виндзор.Что эквивалентно DictionaryAdapterFactory Виндзора в Ninject?

WindsorContainer container = new WindsorContainer(); 
container.AddFacility<Castle.Facilities.FactorySupport.FactorySupportFacility>(); 

container.Register(
Component.For<IApplicationSettings>().UsingFactoryMethod(
    () => new DictionaryAdapterFactory() 
     .GetAdapter<IApplicationSettings>(ConfigurationManager.AppSettings))); 

Кто-нибудь знает заводское расширение для ninject, которое адаптирует словарь?

+0

Что именно делает «DictionaryAdapterFactory»? – BatteryBackupUnit

+0

@BatteryBackupUnit он сопоставляет интерфейс со свойствами словаря, создающего динамический прокси-сервер, на который я верю. Полный пример: http://blog.mirajavora.com/elegant-app-settings-factory/ – regisbsb

+0

Ну ниндзе не имеет предопределенных прокси/перехватчиков для доступа к настройкам. Поэтому вам нужно сделать это самостоятельно (или скопировать его из замка). Часть 'UsingFactoryMethod' достаточно проста, хотя (' Bind () .ToMethod (x => ...) '). – BatteryBackupUnit

ответ

2

Расширение Factory позволяет вам предоставить свои собственные IInstanceProvider. вы можете использовать это для возврата значений из конфигурации:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var kernel = new StandardKernel(); 
     kernel.Bind<IApplicationSettings>().ToFactory(() => new AppSettingProvider()); 

     var settings = kernel.Get<IApplicationSettings>(); 
     Console.WriteLine("One: " + settings.One); 
    } 
} 

public interface IApplicationSettings 
{ 
    string One { get; } 
    int Two { get; } 
    bool Three { get; } 
} 

public class AppSettingProvider : Ninject.Extensions.Factory.IInstanceProvider 
{ 
    public object GetInstance(IInstanceResolver instanceResolver, MethodInfo methodInfo, object[] arguments) 
    { 
     string key = methodInfo.Name; 
     if (key.StartsWith("get_")) 
      key = key.Substring(4); 

     string value = ConfigurationManager.AppSettings[key]; 
     return Convert.ChangeType(value, methodInfo.ReturnType); 
    } 
} 
+0

Ничего себе! Это отлично. На самом деле кливер. Спасибо. – regisbsb

+0

Я бы изменил возврат к Convert.ChangeType (ConfigurationManager.AppSettings [key], methodInfo.ReturnType); поэтому он может обрабатывать целые числа и булевы, например. – regisbsb

+0

хорошо звонок. обновил ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^