Is it possible to register a service at run-time, meaning after the ContainerBuilder has been built and the Container has been created (and ContainerBuilder disposed of)?
            Asked
            
        
        
            Active
            
        
            Viewed 2.1k times
        
    97
            
            
         
    
    
        huysentruitw
        
- 27,376
- 9
- 90
- 133
 
    
    
        Paul Knopf
        
- 9,568
- 23
- 77
- 142
- 
                    Currently, best practices say AutoFac containers [are immutable](https://autofaccn.readthedocs.io/en/latest/best-practices/index.html#consider-a-container-as-immutable) – Ady Sep 21 '19 at 14:58
2 Answers
98
            Yes you can, using the Update method on ContainerBuilder:
var newBuilder = new ContainerBuilder();
newBuilder.Register...;
newBuilder.Update(existingContainer);
 
    
    
        huysentruitw
        
- 27,376
- 9
- 90
- 133
 
    
    
        Peter Lillevold
        
- 33,668
- 7
- 97
- 131
- 
                    2Do note that updating an existing container that has already been used to resolve can result in undeterministic behavior. For instance, replacing components that are dependencies of already resolved singletons cause the original component to stay referenced. – Steven May 18 '16 at 08:33
- 
                    18Update is being deprecated https://github.com/autofac/Autofac/issues/811. – Chase Florell Mar 27 '17 at 23:44
- 
                    1Yes, it is obsolete, and I came here to find the alternate option – Mohammed Dawood Ansari Oct 06 '21 at 12:02
30
            
            
        Since ContainerBuilder.Update has been deprecated, the new recommendation is to use child lifetime scope.
Adding Registrations to a Lifetime Scope
Autofac allows you to add registrations “on the fly” as you create lifetime scopes. This can help you when you need to do a sort of “spot weld” limited registration override or if you generally just need some additional stuff in a scope that you don’t want to register globally. You do this by passing a lambda to BeginLifetimeScope() that takes a ContainerBuilder and adds registrations.
using(var scope = container.BeginLifetimeScope(
  builder =>
  {
    builder.RegisterType<Override>().As<IService>();
    builder.RegisterModule<MyModule>();
  }))
{
  // The additional registrations will be available
  // only in this lifetime scope.
}
- 
                    1The thing to note is that comment in the using block. "The additional registrations will be available only in this lifetime scope." – Ady Sep 21 '19 at 14:57
 
    