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

问题描述 投票:0回答:3

我正在尝试学习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;
     }
}

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

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

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

如有任何建议,我们将不胜感激。

c# winforms autofac
3个回答
6
投票

也注册表格:

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

然后从容器中解析表单:

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;
}

然后

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


0
投票

免责声明:我以前没有使用过Autofac。

我的解决方案基于文档,您将需要更改:

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

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

这是为了让 Autofac 能够找到需要创建的依赖关系。

然后您需要更改:

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

成为:

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

scope.Resolve<MyContext>()
将根据您注册的内容创建依赖项。


0
投票

最佳实践是注册类及其使用服务类的形式。然后通过容器创建表单实例。通过这种方法,实现了依赖注入。

var builder = new ContainerBuilder();
    builder.RegisterInstance(new AService()).As<IAService>();
    builder.RegisterType<LoginForm>();
    container = builder.Build();


using (var scope = container.BeginLifetimeScope())
{
    var loginForm= scope.Resolve<LoginForm>();
    Application.Run(loginForm);
}
© www.soinside.com 2019 - 2024. All rights reserved.