2010-11-03 16 views
5

Ich habe eine Klasse, die ein IRepository für eine Methode in ihrer Klasse verwenden muss.Wie verwenden Sie die Methodeninjektion mit Ninject?

Idealerweise möchte ich vermeiden, diese Abhängigkeit in den Konstruktor der Klasse auflösen zu müssen, und so fand ich in Ninject die Injektion auf Methodenebene und fragte mich, wie das funktioniert?

Ich verstehe, wie Sie es einrichten. Was ich verwirrt bin, ist, wie man es nennt?

Beispiel:

class SomeClassThatUsesRepository 
{ 
    [Inject] 
    public void QueryForSomeStuff(IRepository repository) 
    { 
     //do some stuff 
    } 
} 

Mein Problem ist, wie nenn ich diese Methode ohne eine IRepository Angabe?

würde funktionieren, wenn ich den Konstruktor verwendet, aber ich möchte eine Methode aufrufen.

Wie rufe ich eine Methode mit Ninject-Methode Injektion?

Antwort

12

Ich fürchte, Methode Injektion funktioniert nicht auf diese Weise - es ist nur eine der Möglichkeiten, Abhängigkeiten in ein Objekt während seiner Konstruktion zu injizieren (Sie können Ihre Abhängigkeiten durch Konstruktor Parameter, über Eigenschaften, Felder oder Methoden injizieren). Verfahren Injektion ist nützlich, wenn Sie Ihre Klasse seine Abhängigkeiten nimmt durch Java-Stil Setter-Methoden wie

public void SetRepository(IRepository repository) { ... } 

Wenn es mit [Inject] Attribut gekennzeichnet ist, müssen Sie nicht direkt diese Methoden nennen, ist es von Ninject aufgerufen werden während der Initialisierung, um das Objekt IRepository in Ihr aufgelöstes Objekt zu übergeben.

Also ich glaube, Ihre QueryForSomeStuff Methode wird aufgerufen, wenn Sie Ihre SomeClassThatUsesRepository.

+0

+1 große Erklärung. Ich würde nur erwähnen, dass es eine Zweiphasen-Konstruktion nachahmt - d. H. Als ob die Methode Initialize() genannt würde. –

0

Bestätigt, dass die Methodeninjektion nicht wie vorgesehen funktioniert. Hat eine benutzerdefinierte MVC-Attributklasse und wollte ein injiziertes Objekt darin verwenden. Hat es nicht in den Konstruktor übergeben und hinzugefügt Methode

[Ninject.Inject] 
public void ResolveDI(ISettingStore store) 
{ 
    ConfigHelper = store; 
} 

Diese Methode nie aufgerufen wurde und ConfigHelper war null, wenn die OnActionExecuting des Attributs aufgerufen wurde.

Verwandte Themen