2010-10-21 3 views
1

Я пытаюсь использовать Ninject для ввода XmlReader. Проблема заключается в том, что он создается с помощью заводского метода, созданного конструктором. И я не могу добавить [Inject] в код в .NET Framework. Теперь я использую следующие привязки для создания XmlReader:Использовать фабричный метод в Ninject, который я не могу добавить атрибут к

Bind<IXmlReader>() 
    .ToMethod(
     x => 
     XmlReader.Create(
         (string) GetParameter(x, "inputUri"), 
         (XmlReaderSettings) GetParameter(x, "settings"))) 
    .Named("definition");    


private object GetParameter(IContext context, string name) 
{ 
    var parameters = (List<IParameter>) context.Parameters; 
    return (from p in parameters 
      where p.Name == name 
      select p.GetValue(context)) 
      .FirstOrDefault(); 
} 

И я использую его следующим образом:

var reader = _kernel.Get<IXmlReader>("definition", 
            new Parameter("inputUri", FilePath, false), 
            new Parameter("settings", settings, false))) 

Но этот код ужасен. Могу ли я переписать его каким-нибудь красивым способом?

+0

См. Также http://stackoverflow.com/questions/10141661/ninject-cascading-constructor-arguments/10142063#10142063 –

ответ

1

Вы не делаете DI, вы занимаетесь сервисом.

Я не знаю, ваш реальный контекст, но я думаю, я бы зависеть от Func<string,string,IXmlReader> и сделать Bind следующим образом: -

Bind<Func<string,string,IXmlReader>>() 
    .ToMethod((inputUri,settings) => XmlReader.Create(inputUri,settings)) 
    .Named("definition"); 

Затем вы объявляете впрыскиваемого элемент в конструкторе аргументах:

[Named("definition")]Func<string,string,IXmlReader> createReader 

Веселый бит в том, что [Named] выше - мой собственный атрибут makey upey, и вам нужно сделать условный аспект во время привязки. Взгляните на додзе, он покажет вам, как это сделать. Существует встроенный в NamedAttribute (и был на века, не знаю, что я думал).

Если что-то вроде инъекции фабрики полезно в вашем случае, следующая вещь, которую нужно посмотреть, это Ninject.Extensions.Factory. Он обрабатывает большинство этих видов заводских требований в чистом виде.