Comment utiliser Container au lieu de ObjectFactory dans StructureMap ServiceActivator?

lors de la mise en œuvre 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 suggère:

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

L'intellisense sur Container m'a donné que très peu d'informations.

comment sommes-nous censés réécrire notre ServiceActivator avec le conteneur de la classe?

34
demandé sur Community 2014-08-28 18:09:23

1 réponses

Le statique des choses est d'aller loin . Si vous n'utilisez pas un Localisateur de Service d'un type quelconque, vous allez avoir 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 faux. Merci @JoeMighty pour la mise en garde.

36
répondu mxmissile 2016-01-11 18:41:48