views:

120

answers:

1

I'm adding autofac to an existing project and some of the service implementations require their Initialize method to be called and passed configuration information. Currently I'm using the code:

builder.Register(context =>
              {
               var service = new SqlTaxRateProvider(
      context.Resolve<IUserProvider>()
      );
               service.Initialize(config);
               return service;

              }
).As<ITaxService>()
.SingleInstance();

which works but I'm still creating the object myself which is what I'm trying to get away from this and allow autofac to handle it for me. Is it possible to configuration a post create operation that would carry out the custom initialisation?

To give you an idea of what I'm after ideally this would be the code:

builder.RegisterType<SqlTaxRateProvider>()
 .As<ITaxService>()
 .OnCreated(service=> service.Initialize(config))
 .SingleInstance();

Update: I am using Autofac-2.1.10.754-NET35

A: 
.OnActivating(e => e.Instance.Initialize(...))

should do the trick.

You might also investigate the Startable module (see Autofac wiki).

Mark's suggestion to do initialisation in the constrictor is also a good one. In that case use

.WithParameter(new NamedParameter("config", config))

to merge the config parameter in with the other constructor dependencies.

Cheers!

Nick

Nicholas Blumhardt
Startable module? I feel like I heard the name somewhere... or similar
Krzysztof Koźmic
Thanks Nick, I think the NamedParameter will help eliminate the Initialize() method
Damien McGivern
@Krzysztof yep, Apache Avalon lives on :)
Nicholas Blumhardt