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.

Sign up to request clarification or add additional context in comments.

14 Comments

Surely this just creates a new instance of an empty container? From my experience that seems to be the case.
@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.
I've read this too; however I seem to end up with an empty container. A gist demonstrating this would be greatly appreciated!
@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.
Service location is not and has not ever been an anti-pattern. Usage of the pattern incorrectly does not make the pattern itself wrong.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.