Primeros pasos con autofac

Instalación de Autofac

Para usar Autofac en su proyecto, todo lo que tiene que hacer es instalar Autofac desde NuGet Package Manager. Abra la solución en la que desea usar Autofac, luego seleccione ‘Administrar paquetes NuGet para la solución…’ yendo a:

Tools -> NuGet Package Manager -> Manager NuGet Packages for Solution...

En la pestaña NuGet-Solution, escriba “Autofac” en el cuadro de búsqueda. Asegúrate de estar en la sección “Examinar”. Instale la primera opción como se muestra en la imagen a continuación (tome nota de las regiones marcadas en la imagen):

nuget-autofac

La instalación a través de NuGet agregará automáticamente Autofac en las referencias de los proyectos que se seleccionaron durante la instalación.

Echa un vistazo a la documentación oficial.

Configuración de Autofac

Este ejemplo le mostrará cómo comenzar con Inverion of Control usando Autofac con un proyecto relativamente simple, siguiendo de cerca los documentos oficiales de inicio.

  1. Cree una aplicación de consola desde Archivo -> Nuevo -> Proyecto -> Aplicación de consola

  2. Instale Autofac para este proyecto. Puedes echar un vistazo aquí [Instalando Autofac][3]

  3. Agregue 2 interfaces y 2 clases, con los siguientes nombres:

      Interfaces  |  Classes
    --------------------------
    IOutput       | ConsoleOutput (implementing IOutput)
    IDateWriter   | TodayWriter (implementing IDateWriter)
    

Para simplificar, no se muestran las instrucciones de uso ni los espacios de nombres.

E/S de salida.cs

public interface IOutput
{
    void Write(string content);
}

ConsoleOutput.cs

public class ConsoleOutput : IOutput
{
    public void Write(string content)
    {
        Console.WriteLine(content);
    }
}

IDateWriter.cs

public interface IDateWriter
{
    void WriteDate();
}

TodayWriter.cs

public class TodayWriter : IDateWriter
{
    private IOutput _output;

    public TodayWriter(IOutput output)
    {
        _output = output;
    }

    public void WriteDate()
    {
        _output.Write(DateTime.Today.ToShortDateString());
    }
}

Hasta ahora, el código ha sido claro y simple. ¡Vayamos a la parte donde se lleva a cabo la inyección automática de dependencias, que por supuesto está siendo realizada por Autofac!

Reemplace la clase Program en el archivo Program.cs con este código (Visual Studio crea automáticamente la clase Program en la creación del proyecto. Si no existe, continúe y cree una):

class Program
{
    private static IContainer Container { get; set; }

    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<ConsoleOutput>().As<IOutput>();
        builder.RegisterType<TodayWriter>().As<IDateWriter>();
        Container = builder.Build();

        WriteDate();
    }

    public static void WriteDate()
    {
        using (var scope = Container.BeginLifetimeScope())
        {
            var writer = scope.Resolve<IDateWriter>();
            writer.WriteDate();
        }
    }
}

Cuando se ejecuta, la salida debe ser la fecha actual en la consola. Ha utilizado con éxito Autofac en su proyecto para inyectar dependencias automáticamente.

Esto es lo que sucede debajo del capó:

  1. Al inicio de la aplicación, estamos creando un ContainerBuilder y registrando nuestros Componentes con él. Un componente en términos simples es un tipo .NET que implementa una interfaz y, por lo tanto, expone algunos servicios. Lea [Servicios frente a componentes][4].
  2. Luego registramos nuestros componentes (clases) con los servicios (interfaces) que exponen. Cuando se registra, Autofac sabe qué instancia de una clase crear cuando se va a resolver una interfaz.
  3. Finalmente, cuando ejecutamos el programa:
  • El método WriteDate() (en Main()) solicita a Autofac un IDateWriter.
  • Autofac ve que IDateWriter se asigna a TodayWriter, por lo que comienza a crear un TodayWriter.
  • Autofac ve que TodayWriter necesita un IOutput en su constructor.
  • Autofac ve que IOutput se asigna a ConsoleOutput, por lo que crea una nueva instancia de ConsoleOutput.
  • Autofac usa la nueva instancia ConsoleOutput para terminar de construir el TodayWriter.
  • Autofac devuelve el ‘TodayWriter’ completamente construido para que lo consuma ‘WriteDate()’.

[3]: https://www.wikiod.com/es/autofac/primeros-pasos-con-autofac#Instalación de Autofac [4]: http://docs.autofac.org/en/latest/register/registration.html#services-vs-components