Je suis l'architecture oignon suivant dont la partie Bootstrapper est construite avec Autofac
.WebForms Autofac dans Onion Architecture
architecture est la suivante:
- de base
- injection de dépendances (Autofac est ici)
- service
- Présentation (MVC 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
Mais alors cela viole la conception de l'architecture d'oignon. –
@UsmanKhalid réponse mise à jour –
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. –