Hi,
I am porting a .Net 1.1 desktop application based on Castle + NHibernate +
nano/pico container, based on MVP pattern on .Net 4.
I overcome several problems and I managed to have a few forms of the
existing codebase running properly after updating Castle + NHibernate to the
latest versions and substituting nano/pico container with Windsor.
My biggest problem now is with *component registration in Windsor.
My question in 4 lines: *which is the proper way to register (using fluent
registration) in Winsor an Interface that defines events and is passed as a
parameter in a class constructor (that does not implement it) (IView
containing events passed to Presenter constructor)?
Please note: I tried several variations of fluent registration with odd
results (multiple registrations of IView+EventName, one for each event, but
no "vanilla" IView registration).*
*
*Long and detailed version of the question follows.
*
If I *manually register* components one by one everything works perfectly
and components resolve properly.
semple code:
container.Register(Component.For(Of
Views.Interfaces.IMyForm).ImplementedBy(Of MyForm)
container.Register(Component.For(Of
Presenters.Interfaces.IMyFormPresenter).ImplementedBy(Of MyFormPresenter)
(and so on for each view and presenter, but I have several hundreds classes)
*To resolve* I use:
presenter = container.Resolve(GetType(IMyFormPresenter))
If instead I use *fluent registration *
(sample code)
container.Register(AllTypes.FromThisAssembly().Pick.Where(Component.IsInNamespace("MyApp.Views")).WithService.DefaultInterface())
(please note: I* tried several variation of this*, including separate
registration of presenters and views, using the .BasedOn followed by the
base interfaces implemented in my app, with or without .Pick, with or
without .Where and so on).
I also noticed that the sample above registers also components in
MyApp.Presenters namespace.
No matter the variation I apply, I get this:
- For each "Presenter" the "container" reports that some components are
likely to be misconfigured and properly reports the missing component.
- The missing related component is not in the "misconfigured" components
list: I can find it on the list of properly configured components but not as
I expect: it is *registered several times using every event as part of
service and registration*. (details below)
- I have to register IWindsorContainer, System.Object, System.IntPtr as
components, otherwise most components complains about not being able to be
resolved owing to those missing registrations.
- *I have no issue with fluent registration when the IView does not
define events**.
*
*Details of each component with multiple registrations:
*
Please note: *
*
- *Class1Presenter *is a Presenter in Presenters namespace;
- *IClass1 *is the interface implemented by view Class1 in Views
namespace (passed to *Class1Presenter *constructor);
- Event1,2,3 are actual event names defined in IClass1
container reports a problem for *Class1Presenter*, the "Status" says
that *IClass1
*can be misconfigured so the component might not resolve.
*IClass1 *is actually registered (with status "All dependencies can be
resolved") several times on this way:
Service=*IClass1*+Event1EventHandler; Implementation=*IClass1*
+Event1EventHandler
Service=*IClass1*+Event2EventHandler; Implementation=*IClass1*
+Event2EventHandler
Service=*IClass1*+Event3EventHandler; Implementation=*IClass1*
+Event3EventHandler
...
You got the point, for each event defined in each interface I get a
different component having the event handler as a part of service and
implementation. The service and implementation value is exactly as reported:
*InterfaceName*+*EventName*EventHandler
I have also a variation: let's suppose that Class*2*presenter uses in the
constructor IView*2* implemented in View*2* which inherits from View*3*. If
IView*2* does not contain any event, then Class*2*Presenter is misconfigured
because of missing IView*3*. As usual IView*3* is registered several times,
one for each event.
*The bottom line*
Am I missing something? I suppose that there is something wrong in my code
but I cannot figure out why an event in interface triggers this multiple
registration and how to avoid it.*
*I would like to have advice or sample code to:
- Use fluent registration getting rid of the misconfigured components
- Avoid (if possible) registration of IWindsorContainer, System.Object,
System.IntPt: I have never seen them in any sample and I see no point in
registering them in the container, so it seems to me that are symptoms of a
mistake on my code.
Please note, my app uses MVP in a conventional way: views and presenters can
communicate through interfaces only and to open a form I have to resolve a
presenter from the container and let it instantiate the related view
properly.
I ask you to kindly forgive the length of this post but I tried to be as
clear as possible and I thank you in advance for your patience reading all
this and for help you can provide me.
Luca
--
You received this message because you are subscribed to the Google Groups
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/castle-project-users?hl=en.