Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Container instead of ObjectFactory in StructureMap ServiceActivator?

When implementing DI in WebAPI with StructureMap, we used the ServiceActivator found in

  • Configuring Dependency Injection with ASP.NET WebAPI 2.1
  • WebAPI + APIController with structureMap

public class ServiceActivator : IHttpControllerActivator {     public ServiceActivator(HttpConfiguration configuration) {}          public IHttpController Create(HttpRequestMessage request,            HttpControllerDescriptor controllerDescriptor, Type controllerType)     {         var controller = ObjectFactory.GetInstance(controllerType) as IHttpController;         return controller;     } } 

But now with the new StructureMap, my ReSharper suggested:

Class 'StructureMap.ObjectFactory' is obsolete: ObjectFactory will be removed in a future 4.0 release of StructureMap. Favor the usage of the Container class for future work

The intellisense on Container gave me only very limited information.

How are we supposed to rewrite our ServiceActivator with the Container class?

like image 379
Blaise Avatar asked Aug 28 '14 14:08

Blaise


1 Answers

The static stuff is going away. If your not using a Service Locator of some type you're going to have implement your own "ObjectFactory" as referenced here:

public static class ObjectFactory {     private static readonly Lazy<Container> _containerBuilder =             new Lazy<Container>(defaultContainer, LazyThreadSafetyMode.ExecutionAndPublication);      public static IContainer Container     {        get { return _containerBuilder.Value; }     }       private static Container defaultContainer()      {         return new Container(x =>         {                // default config          });      } } 

Update: My previous answer was wrong. Thanks @JoeMighty for the heads up.

like image 141
mxmissile Avatar answered Oct 04 '22 09:10

mxmissile