Search code examples
castle-windsorioc-containerwcf-ria-services

Windsor IHandlerSelector in RIA Services Visual Studio 2010 Beta2


I want to implement multi tenancy using Windsor and i don't know how to handle this situation:

i succesfully used this technique in plain ASP.NET MVC projects and thought incorporating in a RIA Services project would be similar.

So i used IHandlerSelector, registered some components and wrote an ASP.NET MVC view to verify it works in a plain ASP.NET MVC environment. And it did!

Next step was to create a DomainService which got an IRepository injected in the constructor. This service is hosted in the ASP.NET MVC application. And it actually ... works:i can get data out of it to a Silverlight application.

Sample snippet:

public OrganizationDomainService(IRepository<Culture> cultureRepository)
{
            this.cultureRepository = cultureRepository;
}

Last step is to see if it works multi-tenant-like: it does not! The weird thing is this: using some line of code and writing debug messages in a log file i verified that the correct handler is selected! BUT this handler seems not to be injected in the DomainService. I ALWAYS get the first handler (that's the logic in my SelectHandler)

Can anybody verify this behavior? Is injection not working in RIA Services? Or am i missing something basic??

Development environment: Visual Studio 2010 Beta2

Thanks in advance


Solution

  • So it seems i did a very weird thing in my OrganizationDomainServiceFactory. The code which did NOT work is this:

    public DomainService CreateDomainService(Type domainServiceType, DomainServiceContext context  )
    {
    WindsorContainer container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
    IRepository<Culture> cultureRepository = container.Resolve<IRepository<Culture>>();
    IRepository<Currency> currencyRepository = container.Resolve<IRepository<Currency>>();
    
    DomainService ds = (DomainService)Activator.CreateInstance(domainServiceType, new object[] { cultureRepository,currencyRepository });
    
    ds.Initialize(context);
    return ds;
    }
    

    This is apparently not working, because of the creation of a new Container (which should not take place).

    OK! So i thought i try to use ServiceLocator to get a reference to the Windsor Container (used in the WindsorControllerFactory - that's how i call it ... in the boot up of the ASP.NET MVC application), and changed the code to this:

    public DomainService CreateDomainService(Type domainServiceType, DomainServiceContext context  )
    {
    IRepository<Culture> cultureRepository = ServiceLocator.Current.GetInstance<IRepository<Culture>>();
    IRepository<Currency> currencyRepository = ServiceLocator.Current.GetInstance<IRepository<Currency>>();
    
    DomainService ds = (DomainService)Activator.CreateInstance(domainServiceType, new object[] { cultureRepository,currencyRepository });
    
    ds.Initialize(context);
    return ds;
    }
    

    and guess what: it works(!!!) multi-tenancy as it should be!

    The only thing i don't know is: is there another way to "inject" the container (constructor injection seems not to work here , the compiler complains)

    BTW: moved the project from VS2010Beta2 to VS2010RC (with RIA Services support), but this should not affect the outcome!