web-dev-qa-db-fra.com

Comment utiliser Container au lieu d'ObjectFactory dans StructureMap ServiceActivator?

Lors de l'implémentation de DI dans WebAPI avec StructureMap, nous avons utilisé le ServiceActivator trouvé dans


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;
    }
}

Mais maintenant, avec le nouveau StructureMap , mon ReSharper a suggéré:

La classe 'StructureMap.ObjectFactory' est obsolète: ObjectFactory sera supprimé dans une future version 4.0 de StructureMap. Favoriser l'utilisation de la classe Container pour les travaux futurs

L'intellisense sur Container ne m'a donné que des informations très limitées.

Comment sommes-nous censés réécrire notre ServiceActivator avec la classe Container ?

34
Blaise

Le les choses statiques disparaissent . Si vous n'utilisez pas un localisateur de service d'un certain type, vous allez devoir implémenter votre propre "ObjectFactory" comme référencé ici :

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
         });
     }
}

Mise à jour: Ma réponse précédente était fausse. Merci @JoeMighty pour les avertissements.

36
mxmissile