如何在 Winforms 中使用 Autofac 来注入依赖项
How to use Autofac with Winforms to inject a dependency
我正在努力学习 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 注册被注册为“自我”(即它们可以作为自己的类型解析)和“每个依赖项的实例”(每次解析时都会得到一个新的),因此您可以安全地保留 using
在这种情况下。
免责声明:我之前没有使用过Autofac。
基于 documentation 我的解决方案,您需要更改:
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>()
将根据您注册的内容创建依赖项。
我正在努力学习 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 注册被注册为“自我”(即它们可以作为自己的类型解析)和“每个依赖项的实例”(每次解析时都会得到一个新的),因此您可以安全地保留 using
在这种情况下。
免责声明:我之前没有使用过Autofac。
基于 documentation 我的解决方案,您需要更改:
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>()
将根据您注册的内容创建依赖项。