Injeção de dependência com Autofac – Parte 2 – Web forms

Fala galera!

Continuando sobre o assunto de injeção de dependência com Autofac / DAO, vamos ver agora como aplicar o mesmo exemplo utilizando um projeto ASP .NET Web Forms.

Vamos começar este exemplo do ponto em que já temos o nosso Core e vamos direto a criação do projeto Web Forms.

Vá em File -> Add -> New Project e selecione ASP.NET Web Application. Coloque um nome no projeto e clique em Ok.

Na próxima tela selecione Web Forms. Retire a autenticação e o Microsoft Azure, não vamos precisar disso agora.

Agora vamos adicionar a dependência do Autofac. Abra o Package Manager Console e digite o seguinte comando:

Install-Package Autofac.Web

Após adicionar o pacote do Autofac.Web no projeto, ele vai alterar o web.config e adicionar alguns módulos.

Screenshot_2

e

Screenshot_3

Agora precisamos configurar o Global.asax. Vai ser um pouco diferente do projeto MVC.

Vamos ter que implementar a interface IContainerProviderAccessor na nossa classe Global.

using System;
using System.Web;
using System.Web.Optimization;
using System.Web.Routing;
using Core.Data;
using Core.Data.Models;
using Core.Services;
using Autofac;
using Autofac.Integration.Web;

namespace WebApplication2
{
    public class Global : HttpApplication, IContainerProviderAccessor
    {
        static IContainerProvider _containerProvider;
        public IContainerProvider ContainerProvider
        {
            get
            {
                return _containerProvider;
            }
        }

        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            #region Dependency Injection

            var builder = new ContainerBuilder();

            // Register Business Logic
            builder.RegisterType<ExampleBL>().As<IBusinessLogic<Example>>().InstancePerRequest();

            // Register services
            builder.RegisterType<ExampleService>().As<IExampleService>().InstancePerRequest();

            var container = builder.Build();

            // Web Forms DI
            _containerProvider = new ContainerProvider(container);

            #endregion
        }
    }
}

Agora, outra diferença é que ao invés de utilizar de fazer o bind nos construtores da páginas, ele será feito em propriedades públicas da página.

Crie uma página chamada ExamplePage. Vamos adicionar um GridView na página para exibir os dados:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ExamplePage.aspx.cs" Inherits="WebApplication2.ExamplePage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

<h1>Example Data</h1>

    <asp:GridView ID="grid" runat="server" AutoGenerateColumns="true" Width="100%"></asp:GridView>
</asp:Content>

E no code-behind da página adicione o seguinte código:

using Core.Services;
using System;

namespace WebApplication2
{
    public partial class ExamplePage : System.Web.UI.Page
    {
        // A mágica vai acontecer nessa propriedade
        public IExampleService ExampleService { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            grid.DataSource = this.ExampleService.GetAll();
            grid.DataBind();
        }
    }
}

A propriedade ExampleService vai receber a nossa instância do IExampleService definida no Global.asax.

Ao executar veremos o seguinte resultado:

Screenshot_5

Obs: Por causa do módulo http da injeção automática, tem que alterar o IIS para executar no pipeline clássico. Parar alterar essa configuração no IIS Express do Visual Studio, clique sobre o nome do projeto Web e depois selecione a aba Properties. Altere a propriedade Managed Pipeline Mode para Classic.

Screenshot_6

Atualizei o código fonte do exemplo do post anterior, adicionando o projeto Web Forms:
https://github.com/leonardohof/AutoFacDaoExample

Fontes:
http://docs.autofac.org/en/latest/integration/webforms.html#quick-start


Curta também minha página no Facebook para ficar por dentro das novidades:
https://www.facebook.com/devleonardohofling