2010-10-21 49 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 – 2012-04-15 07:57:25

回答

1

你不是在做DI,而是在做服務位置。

我不知道你的真實背景,但我想我會取決於Func<string,string,IXmlReader>,做綁定如下: -

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

然後你在你的構造ARGS聲明注入項:

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

有趣的是, [Named]以上是我自己makey upey屬性,你需要在綁定時做條件方面。看看道場,它會告訴你怎麼做。 有一個內置的NamedAttribute(並且已經很長時間了,不知道我在想什麼)。

如果像注射工廠這樣的東西在你的情況下有用,接下來要看的是Ninject.Extensions.Factory。它以清潔的方式處理大部分這些工廠要求。