Yeap, you're right - AllTypes, is.. really AllConcreteClasses.

I don't think there's any easy way to change/extend/replicate that in the current version.

So probably your best shot is to use some reflection mixed with code similar to what you demonstrated

HTH,
Krzysztof

On 01/02/2011 6:52 AM, Adam Langley wrote:
Hi guys,

I posted this question on Stack Overflow, and havent received a
response, so I thought I would post it where all the Castle brains are -
and include a link just in case someone wants to share the answer there
too:
http://stackoverflow.com/questions/4823901/castle-windsor-wcf-client-ser
vice-registration-based-on-convention

*snip*

Hi Team!

I have a client-server application, which intercommunicate via WCF. They
also both use Castle Windsor for resolving dependencies.

My goal, is to completely avoid having to explicitly register server, or
client WCF endpoints. I have achieved the server-side by 'convention'
using the following code
// registers all services which implement exactly 1 [ServiceContract]
_windsorContainer.Register(
AllTypes.FromThisAssembly().IncludeNonPublicTypes().Where(
     t =>  1 == (from i in t.GetInterfaces() where
i.IsDefined(typeof(ServiceContractAttribute), true) select i).Count())
     .Configure(c =>  c.LifeStyle.PerWcfSession()
     .ActAs(new DefaultServiceModel().AddEndpoints(
          WcfEndpoint.BoundTo(new NetTcpBinding())
              .At("net.tcp://" + LocalAddress.ToString() + ":7601/" +
c.ServiceType.Name),
          WcfEndpoint.FromEndpoint(new UdpDiscoveryEndpoint())
             ))

     ).WithService.Select(
     (Type type, Type[] baseTypes) =>  from i in type.GetInterfaces()
where i.IsDefined(typeof(ServiceContractAttribute), true) select i
     )
);

This code will find all classes in the current assembly, and any which
implement a service-contract interface (identified by the
ServiceContract attribute) will be registered (with UDP discovery) at
the address
"net.tcp://localhost:7601/[service-contract-interface-name]".

Now, I just want the client-side of the equation.

Typically, to use castle to generate client-proxies for WCF contracts,
the following code will work:
var model = new DefaultClientModel
{
     Endpoint = WcfEndpoint.ForContract<IServiceContract>().BoundTo(new
NetTcpBinding()).Discover(typeof(IServiceContract))
};

container.Register(
     Component.For<ChannelReconnectPolicy>(),
     Castle.Facilities.WcfIntegration.WcfClient.ForChannels(model),
);

What I want, is for Castle to do this kind of registration for all
'service-contract' interfaces in a given assembly - however the AllTypes
helper seems to return only classes, not interfaces (which I guess makes
it an 'AllClasses', not 'AllTypes'!)... Can Castle do this, and what is
the syntax? Krzysztof? (help!)

Thanks!

Adam Langley


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