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.
2 Antworten
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.
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.
Verwandte Fragen
Neue Fragen
c#
C # (ausgesprochen "siehe scharf") ist eine statische Typisierungsprogrammiersprache mit mehreren Paradigmen, die von Microsoft entwickelt wurde. C # -Code zielt normalerweise auf die .NET-Tools und -Laufzeiten von Microsoft ab, zu denen unter anderem .NET Framework, .NET Core und Xamarin gehören. Verwenden Sie dieses Tag für Fragen zu Code, der in der formalen Spezifikation von C # oder C # geschrieben ist.