如何将 Autofac 与 Winforms 一起使用来注入依赖项

Ran*_*ndy 2 c# autofac winforms

我正在努力学习Autofac。我找不到 Winforms 的工作示例。在我的program.cs我有这个:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

MyContext()是一个 DbContext。我想注入MyContext()我的LoginForm(),但我还没有完全弄清楚。的前几行LoginForm()

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

    public LoginForm(MyContext context)
    {
        InitializeComponent();
        _context = context;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激。

Joh*_*ica 6

也注册表格:

var builder = new ContainerBuilder();
builder.RegisterType<MyContext>();
builder.RegisterType<LoginForm>();
Container = builder.Build();
Run Code Online (Sandbox Code Playgroud)

然后从容器中解析表单:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后MyContext当表单解析时会自动注入。默认情况下,Autofac 注册被注册为“self”(即它们可以解析为自己的类型)和“每个依赖项的实例”(每次解析它时都会得到一个新的),因此在这种情况下您可以安全地using保留。