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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
Últimas entradas de Gustavo Sánchez (ver todo)
- NVL in SQL Server - 2023-11-01
- ¿Que es Cake Build? - 2023-02-22
- #How to fix error: MSB4019: The imported project «Microsoft.Data.Tools.Schema.SqlTasks.targets» was not found - 2023-02-20