Try something like this:

container.Register(
   AllTypes.Pick()
      .FromAssembly(typeof(ViewModel<>).Assembly)
      .If(c => c.Name.EndsWith("ViewModel))
      .WithService.Base()        // <---- not sure about this line
   );

On Sun, Nov 8, 2009 at 10:43 AM, queen3 <[email protected]>wrote:

>
> Most of the examples I see for Castle Windsor to do auto-register of
> types depend on deriving from some IFoo. Or, from base class. However,
> I often have simple components (services) that just require IFoo in
> the constructor:
>
> public class AddressViewModel
> {
>  public AddressViewModel(ICountryRepository countries)
>  {
>      this.Countries = countries.GetAll();
>  }
> }
>
> Here AddressViewModel is created by ASP.NET MVC generic ActionFilter
> that transforms domain model into view model - automatically. It asks
> Windsor to create the destination view model. I have many view models,
> and I don't really want to manually register all of them in Windsor.
> From my point of view, if I ask Windsor to create AddressViewModel, it
> should check if its constructor has registered dependencies (maybe
> even nested), and if so - create them and then create AddressViewModel
> - instead of throwing "not registered".
>
> How do I make Windsor to automatically register/recognize such cases?
> I see two ways:
>
> 1. Browse all types in assembly, get their constructors, check if any
> of the constructor's parameter is registered in Windsor... and
> register it. The problem is that Service can depend on Service2 ->
> IFoo... I want CONTAINER to do this, not me.
> 2. Somehow extend Windsor (facility, etc - I'm not expert here) so
> that the above happens during "Resolve" call - so that I don't need to
> browse all the meaningless types in all assemblies.
> In both cases, however, I'll need a way to ask Windsor "Is type T your
> dependency - directly or indirectly via nested constructor?".
>
> I really hate duplication, so I don't see why I need to manually
> register something that Windsor does already know about and can
> create.
>
> Here's the code that I use now. I'm really not expert in Windsor so
> I'm not sure if the code is OK - but it works.
>
>     var dependencies = container.Kernel.GetAssignableHandlers(typeof
> (object));
>     // for all ViewModel classes - purely optimization, to avoid
> browsing all types
>     foreach (var type in typeof(ViewModel<>).Assembly.GetTypes().Where
> (x => x.Name.EndsWith("ViewModel")))
>     {
>        // get all constructors and their parameters
>        var ctorArgs = type.GetConstructors().SelectMany(x =>
> x.GetParameters());
>        // ViewModel can be resolved if any of its ctors has Windsor-
> registered arguments
>        // TODO: add checks for IList<Type>, etc... really Windsor
> should do this
>        var canBeResolved = dependencies.Any(dep => ctorArgs.Any(a =>
>                     a.ParameterType.IsAssignableFrom
> (dep.ComponentModel.Service)));
>        if (canBeResolved)
>           container.AddComponent("viewModel" + type.Name, type);
>     }
>
> However, I would better have Windsor (or my extension) do this during
> resolve-time, because brosing ALL types is a bit overkill in my
> opinion, even though I narrow it with name filter. Is it possible? Is
> there a better way?
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to