#HowTo Crear un Factory delegate en Autofac 6.0.0 y C#.

En este post te voy a explicar como resolver dependencias usando factory delegates con C# y Autofac.

Primeros pasos.

  • Estoy empleando Autofac 6.0.0, si utilizas otra versión anterior puede que la funcionalidad sea distinta o no exista.
  • Los delegates pueden ser colocados en la misma clase o en otra.
  • Todos los argumentos de los constructores y delegados deben coincidir en nombre y posición.
  • Los delegados pueden utilizarse como dependencias inyectables.
  • El ejemplo cubre argumentos simples, dependencias inyectadas y no inyectadas.
  • No es necesario registrar los delegate factories manualmente.

Ejemplo:

using System;
using Autofac;
namespace Happydevops.AutofacFactory
{
//You could put your delegate in the same class you're creating or in other one.
// The argument's names and position must match. Otherwise Autofac will try to inject them.
internal static class ComplexClassFactory
{
//Case 1
public delegate IComplexClass Build(string simpleArgument, NonInjectedDependency nonInjectedDependency);
//Case 2
public delegate IComplexClass BuildCase2(string simpleArgument);
}
internal class ComplexClass : IComplexClass
{
private readonly string _simpleArgument;
private readonly NonInjectedDependency _nonInjectedDependency;
private readonly IInjectedDependency _injectedDependency;
//Case 1, a simple argument + non-injected dependency + injected dependency
public ComplexClass(string simpleArgument,
NonInjectedDependency nonInjectedDependency,
IInjectedDependency injectedDependency)
{
_simpleArgument = simpleArgument;
_nonInjectedDependency = nonInjectedDependency;
_injectedDependency = injectedDependency;
}
//Case 2, a simple argument + an injected dependency. We have two cases to show constructor's overloading
public ComplexClass(string simpleArgument, IInjectedDependency injectedDependency)
{
_simpleArgument = simpleArgument;
_injectedDependency = injectedDependency;
_nonInjectedDependency = new NonInjectedDependency("Non-injected created in constructor");
}
public void DoStuff()
{
Console.WriteLine(_simpleArgument);
Console.WriteLine(_nonInjectedDependency.Message);
Console.WriteLine(_injectedDependency.Message);
}
}
internal class Program
{
private static IContainer CreateContainer()
{
// We don't need to register factory's delegates.
var builder = new ContainerBuilder();
builder.RegisterType<ComplexClass>()
.As<IComplexClass>()
.AsSelf()
.InstancePerDependency();
builder.RegisterType<InjectedDependency>()
.As<IInjectedDependency>()
.AsSelf()
.InstancePerDependency();
return builder.Build();
}
static void Main()
{
var container = CreateContainer();
// Case 1
Console.WriteLine("CASE 1");
var complexClassFactory = container.Resolve<ComplexClassFactory.Build>();
var complexClass = complexClassFactory("This is a simpleArgument", new NonInjectedDependency());
complexClass.DoStuff();
Console.WriteLine();
//Case 2
Console.WriteLine("CASE 1");
var complexClassFactoryCase2 = container.Resolve<ComplexClassFactory.BuildCase2>();
var classFactoryCase2 = complexClassFactoryCase2("This is another example");
classFactoryCase2.DoStuff();
Console.Read();
}
}
#region Dependencies
public class InjectedDependency : IInjectedDependency
{
public string Message { get; }
public InjectedDependency()
{
Message = "This is a injected dependency";
}
}
public class NonInjectedDependency
{
public string Message { get; }
public NonInjectedDependency(string message)
{
Message = message;
}
public NonInjectedDependency()
{
Message = "This is a non injected dependency";
}
}
internal interface IInjectedDependency
{
string Message { get; }
}
internal interface IComplexClass
{
void DoStuff();
}
#endregion
}

Gustavo Sánchez

Soy especialista en escribir software de calidad. Mediante el uso de marcos de trabajo, técnicas y automatización de procesos he podido reducir los costes operativos de los sistemas de la empresa. Sistemas confiables y adaptables producen clientes felices.

Site Footer