Ich versuche Autofac zu lernen. Ich kann kein funktionierendes Beispiel für Winforms finden. In meinem program.cs habe ich Folgendes:

public static IContainer Container { get; private set; }

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static void Main()
{
     var builder = new ContainerBuilder();
     builder.Register(c => new MyContext());
     Container = builder.Build();
     ...
     using (var loginForm = new LoginForm(new MyContext()))
     {
         DialogResult results;
         do
         {
             results = loginForm.ShowDialog();
             if (results == DialogResult.Cancel)
                 Environment.Exit(1);
         } while (results != DialogResult.OK);
            
         UserName = loginForm.ValidatedUserName;
     }
}

MyContext() ist ein DbContext. Ich möchte MyContext() in mein LoginForm() injizieren, habe das aber noch nicht ganz herausgefunden. Die ersten Zeilen von LoginForm():

public partial class LoginForm : Form
{
    private readonly MyContext _context;

    public LoginForm(MyContext context)
    {
        InitializeComponent();
        _context = context;
    }
    ...
}

Anregungen wäre dankbar.

0
Randy 18 Aug. 2020 im 04:42

2 Antworten

Beste Antwort

Registrieren Sie auch das Formular:

var builder = new ContainerBuilder();
builder.RegisterType<MyContext>();
builder.RegisterType<LoginForm>();
Container = builder.Build();

Und dann das Formular aus dem Container auflösen:

using (var loginForm = Container.Resolve<LoginForm>())
{
    DialogResult results;
    do
    {
        results = loginForm.ShowDialog();
        if (results == DialogResult.Cancel)
            Environment.Exit(1);
    } while (results != DialogResult.OK);
       
    UserName = loginForm.ValidatedUserName;
}

Dann wird MyContext automatisch eingefügt, wenn das Formular aufgelöst wird. Standardmäßig werden Autofac-Registrierungen als "self" (dh sie können als eigener Typ aufgelöst werden) und "instance per dependency" (Sie erhalten jedes Mal eine neue Instanz, wenn Sie sie auflösen) registriert, sodass Sie sicher sein können, {{X1 }} in diesem Fall.

3
John 18 Aug. 2020 im 02:23

Haftungsausschluss : Ich habe Autofac noch nicht verwendet.

Wenn Sie meine Lösung auf der Dokumentation basieren, müssen Sie Änderungen vornehmen ::

builder.Register(c => new MyContext());

Zu

builder.Register(c => new MyContext()).AsSelf();

Auf diese Weise kann Autofac die Abhängigkeit finden, die erstellt werden muss.

Sie müssen dann ändern:

using (var loginForm = new LoginForm(new MyContext()))
{
    ...
}

Sein:

using (var scope = Container.BeginLifetimeScope())
{
    using (var loginForm = new LoginForm(scope.Resolve<MyContext>()))
    {
        ...
    }
}

Die Zeile scope.Resolve<MyContext>() erstellt die Abhängigkeit basierend auf Ihrer Registrierung.

0
Dharman 18 Aug. 2020 im 02:18