Castle Windsor: Auto-register types from one assembly that implement interfaces from another

杀马特。学长 韩版系。学妹 提交于 2019-11-28 21:39:00

With AllTypes you can easily do this:

From http://stw.castleproject.org/(S(nppam045y0sdncmbazr1ob55))/Windsor.Registering-components-by-conventions.ashx:

Registering components one-by-one can be very repetitive job. Also remembering to register each new type you add can quickly lead to frustration. Fortunately, you don't have to do it, at least always. By using AllTypes entry class you can perform group registration of types based on some specified characteristics you specify.

I think your registration would look like:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly)
    .BasedOn<IEmployeeService>()
    .LifeStyle.Singleton

If you implement a base type, like IService on your interfaces, you can register them all at once using the following construct:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly)
    .BasedOn<IService>()
    .WithService.FromInterface()
    .LifeStyle.Singleton

For more examples, see the article. This has a very good description on what the possibilities are.

Neil Barnwell

I took Pieter's answer forward just a little bit (the key being, as he suggested, AllTypes) and have come up with this:

// Windsor 2.x
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl")
    .Where(type => type.IsPublic)
    .WithService.FirstInterface()
    );

This goes through all public classes in the MyApp.ServicesImpl.dll assembly and registers each in the container using the first interface it implements. Because I want all the classes in the services assembly, I need no marker interface.

The above works for an old version of Windsor. The current Castle Windsor documentation for registering components for the latest version suggests the following:

// Windsor latest
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl")
    .Where(type => type.IsPublic) // Filtering on public isn't really necessary (see comments) but you could put additional filtering here
    .WithService.DefaultInterface()
    );
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!