2017-07-24 1 views
0

Je suis l'architecture oignon suivant dont la partie Bootstrapper est construite avec Autofac.WebForms Autofac dans Onion Architecture

architecture est la suivante:

  1. de base
  2. injection de dépendances (Autofac est ici)
  3. service
  4. Présentation (MVC 5)
  5. test

je avais besoin Pages WebForm.aspx pour afficher mes rapports. donc je suis les instructions données le lien pour l'intégration de WebForms avec Autofac: http://docs.autofac.org/en/latest/integration/webforms.html

Voici le code de injection de dépendances:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")] 
namespace DependencyInjection.App_Start 
{ 
    public class IocConfig : IContainerProviderAccessor 
    { 
     // Provider that holds the application container. 
     static IContainerProvider _containerProvider; 

     // Instance property that will be used by Autofac HttpModules 
     // to resolve and inject dependencies. 
     public IContainerProvider ContainerProvider 
     { 
      get { return _containerProvider; } 
     } 

     public static void RegisterDependencies() 
     { 
      // Build up your application container and register your dependencies. 
      var builder = new ContainerBuilder(); 

      // Register your MVC controllers. (MvcApplication is the name of 
      // the class in Global.asax.) 
      builder.RegisterControllers(typeof(MvcApplication).Assembly); 

      // OPTIONAL: Register model binders that require DI. 
      builder.RegisterModelBinders(typeof(MvcApplication).Assembly); 
      builder.RegisterModelBinderProvider(); 

      // OPTIONAL: Register web abstractions like HttpContextBase. 
      builder.RegisterModule<AutofacWebTypesModule>(); 

      // OPTIONAL: Enable property injection in view pages. 
      builder.RegisterSource(new ViewRegistrationSource()); 



      // OPTIONAL: Enable property injection into action filters. 
      builder.RegisterFilterProvider(); 

builder.RegisterType<MyService().As<IMyService().InstancePerRequest(); 

      // Once you're done registering things, set the container 
      // provider up with your registrations. 
      _containerProvider = new ContainerProvider(container); 
     } 
    } 
} 

En App.Config de injection de dépendances, j'ai ajouté:

<system.web> 
    <httpModules>  
     <add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/> 
     <add name="PropertyInjection" type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web"/> 
    </httpModules> 
    </system.web> 
    <system.webServer> 
    <modules> 
     <add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web" preCondition="managedHandler"/> 
     <add name="PropertyInjection" type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web" preCondition="managedHandler"/> 
    </modules>  
    </system.webServer> 

Cela ne fonctionne toujours pas. MyService est toujours null. Quand j'ajoute le paramètre App.Config dans web.config de ma présentation, je suis l'erreur suivante:

This module requires that the HttpApplication (Global Application Class) implements IContainerProviderAccessor

Répondre

0

Autofac ASP.net intégration WebForm exige que le HttpApplication implémente IContainerProviderAccessor. Si vous souhaitez utiliser WebActivator avec votre classe IocConfig. La classe Global.asax doit encore implémenter l'interface IContainerProviderAccessor pour permettre au HttpModule de trouver le conteneur Autofac.

Vous pouvez implémenter cette interface en se basant sur la mise en œuvre IocConfig

Global.asax.cs

public class Global : HttpApplication, IContainerProviderAccessor 
{ 
    // Instance property that will be used by Autofac HttpModules 
    // to resolve and inject dependencies. 
    public IContainerProvider ContainerProvider 
    { 
    get { return IocConfig.ContainerProvider; } 
    } 
} 

et votre IocConfig n'a pas besoin de mettre en œuvre IContainerProviderAccessor mais qui ont besoin d'avoir un public static propriété pour le IContainerProvider

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(IocConfig), 
                "RegisterDependencies")] 

namespace DependencyInjection.App_Start 
{ 
    public class IocConfig : IContainerProviderAccessor 
    { 
     // Provider that holds the application container. 
     static IContainerProvider _containerProvider; 

     // Instance property that will be used by Autofac HttpModules 
     // to resolve and inject dependencies. 
     public static IContainerProvider ContainerProvider 
     { 
      get { return _containerProvider; } 
     } 
+0

Mais alors cela viole la conception de l'architecture d'oignon. –

+0

@UsmanKhalid réponse mise à jour –

+0

Cette solution nécessite qu'Autofac soit présent dans la couche Présentation, ce qui viole la conception de l'architecture Onion. Toutes les bibliothèques liées à l'injection de dépendances doivent être au niveau de DependencyInjection Layer. –