All credit should go to Craig Neuwirt, for some amazing feats of syntax. He has managed to extend Binsor to include practically all of Windsor's configuration schema. This is important because previously we had to resort to either manual / ugly stuff or go back to XML (see: manual & ugly).
This is important because some of the more interesting things that you can do with Windsor are done using the facilities, and Craig has made sure that Binsor will support the main ones in a natural manner, including out of the box support for the standard configuration model.
Let us start by using the standard configuration model for a moment, the Active Record Integration Facility is expecting to be configured from XML, but we can configure it like this:
facility arintegration, ActiveRecordFacility: configuration: @isWeb = true, isDebug = true assemblies = [ Assembly.Load("My.Assembly") ] config(keyvalues, item: add): show_sql = true command_timeout = 5000
connection.isolation = 'ReadCommitted' cache.use_query_cache = false dialect = 'NHibernate.Dialect.MsSql2005Dialect' connection.provider = 'NHibernate.Connection.DriverConnectionProvider' connection.driver_class = 'NHibernate.Driver.SqlClientDriver' connection.connection_string_name = 'MyDatabase' end end
To compare, here is the equivalent XML configuration.
<facility id="arintegration" type="Castle.Facilities.ActiveRecordIntegration.ActiveRecordFacility, Castle.Facilities.ActiveRecordIntegration" isWeb="true" createSchema="true"> <assemblies> <item>My.Assembly</item> </assemblies> <config> <add key="hibernate.cache.use_query_cache" value="true" /> <add key="hibernate.connection.isolation" value="ReadCommitted" /> <add key="hibernate.show_sql" value="false" /> <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" /> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="hibernate.connection.connection_string_name" value="MyDatabase" /> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> </config> </facility>
We don't have any significant reduction in the number of lines. This is mostly because we need to specify a lot of items for the facility to work, but we do have significant reduction in the noise that we have to deal with.
But, frankly, this isn't the best sample, let us take a look at the shortcuts that Binsor now provides, shall we?
<component id="SimpleListener" type="Castle.Facilities.EventWiring.Tests.Model.SimpleListener, Castle.Facilities.EventWiring.Tests" /> <component id="SimplePublisher" type="Castle.Facilities.EventWiring.Tests.Model.SimplePublisher, Castle.Facilities.EventWiring.Tests" > <subscribers> <subscriber id="SimpleListener" event="Event" handler="OnPublish"/> </subscribers> </component>
And the Binsor configuration to match it:
component simple_listener, SimpleListener component simple_publisher, SimplePublisher: wireEvent Publish: to @simple_listener.OnPublish
Now that is far clearer, isn't it?
<component id="mycompfactory" type="Company.Components.MyCompFactory, Company.Components"/> <component id="mycomp" type="Company.Components.MyComp, Company.Components" factoryId="mycompfactory" factoryCreate="Create" />
component mycompfactory, MyCompFactory component mycomp, MyComp: createUsing @mycompfactory.Create
Other new features:
- Integrating Castle Resources, so now we can use Binsor over several files, which can be located anywhere, including assembly resources, for instance.
- Easy support for startable and life styles.
- Extension points for future needs.