Utilizzo di Autofac per inserire una dipendenza nel punto di ingresso principale in un'app console

Utilizzo di Autofac per inserire una dipendenza nel punto di ingresso principale in un'app console

Quello che dovresti fare è estrarre tutta la logica dal tuo main in una classe. Questa classe può avere un costruttore con dipendenze. Risolvi questa classe nel main e la chiami. Questa classe dovrebbe quindi essere considerata come l'intera applicazione . Tutto ciò che accade all'interno del Program la classe ora può essere considerata la tua radice di composizione.

// Begin composition root
public static class Program
{
    public static void Main(string[] args) 
    {
        var container = ConfigureContainer();
        var application = container.Resolve<ApplicationLogic>();

        application.Run(args); // Pass runtime data to application here
    }

    private static IContainer ConfigureContainer()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<ApplicationLogic>.AsSelf();
        builder.RegisterType<Log>().As<ILog>();
        // Register all dependencies (and dependencies of those dependencies, etc)

        return builder.Build();
    }
}
// End composition root

public class ApplicationLogic
{
    private readonly ILog log;

    public ApplicationLogic(ILog log) {
        this.log = log;
    }

    public void Run(string[] args) {
        this.log.Write("Hello, world!");
    }
}

Nota che container.Resolve<ApplicationLogic>() non è solo risolvere il ApplicationLogic class, risolve l'intero oggetto grafico inclusi tutti di ApplicationLogic le dipendenze di e le dipendenze di quelle dipendenze, ecc., non importa quanto sia profondo il grafico. L'unica cosa di cui sei responsabile è registrare quelle dipendenze nel ConfigureContainer() metodo. Pertanto, è alquanto insolito avere non più di 1 Resolve() metodo chiama un'applicazione console e, se ce ne sono, dovrebbero sempre essere chiamati o collegati all'interno della radice della composizione.


Devi configurare un contenitore da qualche parte . Nelle app della console, Main() di solito è quel posto.


Ho dovuto cambiare builder.RegisterType.AsSelf(); a builder.RegisterType().AsSelf(); per farlo funzionare per me