2016-07-27 5 views
1

Ninject erstellt für mich Instanz der Klasse A, die von Klasse B abhängt (so ninject erstellt auch Objekt B). Ninject ist so konfiguriert, dass einzelne Instanzen der Klasse A (InSingletonScope) und viele Instanzen der Klasse B (InTrancientScope) zurückgegeben werden. Klasse A hat eine Eigenschaft, die es ermöglicht, Abhängigkeit von Objekt B zu erhalten/setzen.ninject - inject Abhängigkeit zu bestehenden Objekt während der Anfrage

Ist es möglich, Instanz der Klasse A mit neu erstellter Instanz B jedes Mal abzurufen, wenn ich dieselbe Instanz der Klasse A anfordere?

Die Methode OnActivation würde den Trick machen, wenn sie bei jeder Anfrage ausgeführt wurde, nicht nur beim ersten Mal.

Oder vielleicht ist dies ein Anti-Muster, das ich tun werde?

EDIT: Um XY Problem zu vermeiden, werde ich versuchen, mehr Details zu erklären. Die Lösung ist zu groß, um alles so lange zu erklären:

Es gibt eine Operation zu tun, zum Beispiel Inventur. Der Vorgang wird von drei Referenten (P1, P2, P3) ausgefüllt. Presenter verwaltet entsprechende Views (V1, V2, V3). Der Benutzer gibt Daten in Sichten ein, Präsentatoren holen die Daten von Sichten und speichert sie in den Betrieb. Alle Präsentatoren und Ansichten sind Singletons (InSingletonScope), um bei jedem Bedarf die Erstellung von Objekten zu vermeiden. Ansichten werden in geeignete Präsentatoren eingefügt. Jedes Mal, wenn die Operation gestartet wird, sollte eine neue Instanz der Operation erstellt und allen bereits vorhandenen Presentern hinzugefügt werden.

+2

Sie wahrscheinlich statt die Abhängigkeit in den Singleton injiziert wird. Injizieren Sie eine Factory für diese Abhängigkeit in den Singleton, und rufen Sie Create in dieser Factory auf, wenn Sie immer eine Instanz –

+0

möchten, die Sie jederzeit in den Service Locator injizieren können, um die Abhängigkeit jedes Mal aufzulösen. –

+0

OK, das ist eine Lösung, aber ich frage mich, ob es eine einfachere Lösung gibt. Einige .OnResolved-Methode wäre sehr einfach. Ich frage mich, warum es so etwas nicht gibt. – raV720

Antwort

0

Immer wenn Sie den Presenter vom IOC anfordern, wird derselbe Presenter mit derselben Operation Factory zurückgegeben. Die Operation Factory kann dasselbe Objekt oder neue Objekt zurückgeben, wenn Sie IsValid auf false setzen. Der Beispielcode, der erzeugt wird, um das Problem zu lösen:

THE OPERATION:

public abstract class Operation 
    { 
     protected Logger logger; 

     public Operation(Logger logger) 
     { 
      this.logger = logger; 
     } 
    } 


public class StocktakingOperation : Operation 
    { 
     public string test = DateTime.Now.ToString(); 

     public StocktakingOperation(Logger logger) 
      : base(logger) 
     { 

     } 
    } 

THE FACTORY:

class OperationFactory<T> where T : Operation 
    { 
     private Func<T> ObjectCreation; 

     private T ValidObject; 


     public OperationFactory(Func<T> ObjectCreation) 
     { 
      IsValid = false; 
      this.ObjectCreation = ObjectCreation; 
     } 


     /// <summary> 
     /// While is True then the same operation is returned. 
     /// Set it to False to invalidate current operation so the next call to get operation will return new operation. 
     /// </summary> 
     public bool IsValid { get; set; } 



     public T GetOperation() 
     { 
      if (IsValid == false) 
      { 
       ValidObject = ObjectCreation(); 
       IsValid = true; 
      } 

      return ValidObject; 
     } 

    } 


class StocktakingOperationFactory : OperationFactory<StocktakingOperation> 
    { 
     public StocktakingOperationFactory(Func<StocktakingOperation> ObjectCreation) 
      : base(ObjectCreation) 
     { 

     } 
    } 

VORFÜHRER

class StocktakingPresenter : BaseOperationPresenter<StocktakingPresentersManager, OPERATION_TYPE> 
    { 

     public StocktakingPresenter(QuickForm QuickForm, StocktakingOperationFactory OperationFactory, VIEW_TYPE view, Workspace workspace, Logger logger) 
      : base(QuickForm, OperationFactory, view, workspace, logger) 
     {} 


    } 

UND IOC:

kernel.Bind<StocktakingOperation>().ToSelf(); 

kernel.Bind<StocktakingOperationFactory>().ToMethod(c => 
      new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); }) 
      ).InSingletonScope(); 
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope(); 
Verwandte Themen