如何在Winforms中使用Autofac注入依赖项

问题描述

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

任何建议将不胜感激。

解决方法

也注册表格:

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注册被注册为“自身”(即可以将其解析为自己的类型)和“每个依赖项的实例”(每次解决时都会获得一个新实例),因此可以放心{{1 }}。

,

免责声明:我以前从未使用过Autofac。

基于documentation的解决方案,您需要进行以下更改:

let theMainString = "<div>Hello & World</div>"; let span = document.createElement('span'); span.innerText = theMainString; console.log(span.innerHTML)

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

这是为了使Autofac可以找到需要创建的依赖项。

然后您需要更改:

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

成为:

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

using (var scope = Container.BeginLifetimeScope()) { using (var loginForm = new LoginForm(scope.Resolve<MyContext>())) { ... } } 行将根据您注册的内容创建依赖关系。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...