37

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


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?

1 Answer 1

39

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.

14
  • 1
    Surely this just creates a new instance of an empty container? From my experience that seems to be the case. Commented Oct 24, 2014 at 9:22
  • @JoeMightly To quote the author "ObjectFactory is just a static facade over Container anyway". However, I will throw up a gist later today that proves this.
    – mxmissile
    Commented Nov 6, 2014 at 14:08
  • I've read this too; however I seem to end up with an empty container. A gist demonstrating this would be greatly appreciated! Commented Nov 6, 2014 at 14:11
  • 1
    @JoeMighty You are correct! I used Service Locator and/or the built in MVC DependencyResolver for resolution with SM3, so I never ran into this problem. However after several tests, as far as I can tell I end up with empty containers like you noted.
    – mxmissile
    Commented Nov 6, 2014 at 17:23
  • 3
    Service location is not and has not ever been an anti-pattern. Usage of the pattern incorrectly does not make the pattern itself wrong. Commented Oct 30, 2015 at 20:21

Not the answer you're looking for? Browse other questions tagged or ask your own question.