11
votes

Injection de dépendance du CIO dans le module HTTP personnalisé - Comment? (Asp.net)

J'ai un module HTTP personnalisé. Je voudrais injecter l'enregistreur à l'aide de mon cadre IOC afin que je puisse enregistrer des erreurs dans le module. Cependant, bien sûr, je ne reçois pas de constructeur, je ne peux donc pas l'injecter. Quelle est la meilleure façon d'y aller?

Si vous avez besoin du conteneur CIO spécifique, je suis actuellement en train d'utiliser Windsor, mais peut-être bientôt passer à Autofac.

merci


1 commentaires

Vous pouvez utiliser un localisateur de services, jetez un coup d'œil à cette question: Différence entre l'injection de dépendance et le modèle de localisateur de services


4 Réponses :



3
votes

Vous pouvez passer dans les dépendances requises via le contexte httpApplication qui vous est transmis par la méthode init ... xxx


4 commentaires

@MAURICIO SCHEFFER: Peut-être, mais simplement implémenter le module comme une humble exécutable. Je préfère cette approche sur l'utilisation d'une injection statique. Les gens pensent que cela aide à la testabilité, mais cela le fait vraiment mal.


L'humble exécutable fonctionne certainement bien dans ce cas, j'ajouterais cette information à la réponse. Cependant, vous pouvez avoir votre gâteau et le manger aussi, voir ma solution.


Cette solution est-elle considérée comme une mise en œuvre du modèle de conception de lieu de service?


@Parthshah Bonne observation. Oui, c'est une variation du localisateur de service anti-motif . La seule raison pour laquelle je lui ai suggéré est due aux contraintes de mettre en œuvre un ihttpmodule .



10
votes

Première fois que j'ai vu une injection de dépendance à httpmodules dans Spring.net (ne publicitant pas ce cadre). L'idée est que vous disposez de HTTPModule spécial qui injecte des dépendances à d'autres niveaux de niveau httpmodule-s.

Version actuelle de malheur de autofac.integration.web ne supporte pas cela, mais vous pouvez facilement le faire vous-même: P>

  <httpModules>
   <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
   <add name="HttpModuleInjection" type="WebTest.HttpModuleInjectionModule, WebTest"/>
   <add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/>
   <add name="PropertyInjection" type="Autofac.Integration.Web.PropertyInjectionModule, Autofac.Integration.Web"/>
   <add name="MyModule" type="WebTest.MyModule, WebTest"/>
  </httpModules>


1 commentaires

Ceci est assez limité, ne peut pas faire d'injection de constructeur.



1
votes

Je suis curieux de la réponse d'Andrey-Tsykunov, mais je n'ai pas le représentant de commenter dessus.

J'essaie de me mettre à l'aise avec IOC et DI, alors il me manque peut-être quelque chose, mais ne serait-ce pas Soyez plus simple d'utiliser iContainerProviderAccessor à partir de myModule, plutôt que de créer un autre module? p>

Par exemple: P>

public class MyModule : IHttpModule
{
    public void Dispose()
    {            
    }

    public void Init(HttpApplication context)
    {
        Assert.IsNotNull(MyService);

        var containerProviderAccessor = context as IContainerProviderAccessor;

        if (accessor != null)
        {
            IContainer container = containerProviderAccessor.ContainerProvider.ApplicationContainer;
            MyService = container.Resolve<IMyService>();
        }
    }

    private IMyService MyService { get; set; }
}


2 commentaires

Vous ne faites pas une injection de dépendance ici, vous faites un lieu de service.


On dirait que tu as la chose de la représentation triée: p