2009-07-22 14 views
0

Ich binden eine Komponente in die IWindsorContainer registrieren dhHinzufügen zusätzlicher Abhängigkeit Schloss Windsor mit

_container.Register(Component.For<IView>().ImplementedBy<View>()); 
_container.Register(Component.For<Presenter>()); 

Wenn ich die i auch wollen Ansicht lösen, um die Presenter erstellen möchten, so dass ich auf alle Ereignisse abonnieren können, dass werden von der Ansicht generiert. Kann dies während des Registrierungsprozesses erreicht werden oder brauche ich irgendeine Art von Einrichtung?

public interface IView 
{ 
    event Action<string> Process; 
} 

public class View : IView 
{ 
    public event Action<string> Process; 
} 

public class Presenter 
{ 
    public Presenter(IView view) 
    { 
    view.Process += (args) => this.DoSomeStuff(); 
    } 
} 

Ich habe eine eigene Registrierung geschrieben, aber es funktioniert nicht wie erwartet

public class ViewRegistration<TView> : IRegistration where TView : IView 
{ 
    private Type _implementation, _presenter; 

    public ViewRegistration<TView> ImplementedBy<TImplementation>() where TImplementation : TView 
    { 
     _implementation = typeof(TImplementation); 
     return this; 
    } 

    public ViewRegistration<TView> Using<TPresenter>() 
    { 
     _presenter = typeof(TPresenter); 
     return this; 
    } 

    public void Register(IKernel kernel) 
    { 
     var model = kernel.ComponentModelBuilder.BuildModel(_implementation.FullName, typeof(TView), _implementation, null); 
     if (_presenter != null) 
     { 
      var test = kernel.ComponentModelBuilder.BuildModel(_presenter.FullName, _presenter, _presenter, null); 

      model.AddDependent(test); 
     } 
     kernel.AddCustomComponent(model);    
    } 
} 
+0

cross-gepostet: http://groups.google.com/group/castle-project-users/browse_thread/thread/f0c8733f07a6a005 –

Antwort

0

Normalerweise mache ich das anders:

  1. Ansicht erhält der Moderator im Konstruktor injiziert. Auf diese Weise stellen Sie sicher, dass beide gleichzeitig erstellt werden (wenn Sie IView aus dem Container auflösen)
  2. Der Präsentator erhält die Ansicht im Konstruktor nicht. Vielmehr füge ich den Code in den Konstruktor der Ansicht zuweisen ausdrücklich:
public View(Presenter presenter) 
{ 
    this.presenter = presenter; 
    presenter.AssignView (this); 
} 

Natürlich könnte es anders sein, um - aber dann würden Sie den Presenter lösen müssen, nicht der IView.

Verwandte Themen