gpt4 book ai didi

c# - 是否有用于 WinForm 的 Autofac 集成库

转载 作者:行者123 更新时间:2023-11-30 20:23:54 25 4
gpt4 key购买 nike

我正在使用 Autofac 开发 Win 窗体应用程序这里我们解决依赖如下:如 doc 中所示

using (var scope = DIConfig.container.BeginLifetimeScope())
{
var us = scope.Resolve<IUsersService>();
usersGrid.DataSource = us.GetUsers();
}

但是在 Web MVC 项目中我们可以解决所有的依赖关系例如

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

这样就不需要每次都解析作用域了并使用简单的代码

usersGrid.DataSource = us.GetUsers();

我们如何在 Winform 中进行类似的解析,而不需要使用更多代码? Winforms中如何解决依赖关系?有Autofac integration library吗?对于 WinForm?

最佳答案

我在不久的将来成功地将 WinForms 应用程序迁移到使用 Autofac。我想要一个具有以下动机的设计。

  • 在 ASP.NET MVC 应用程序的情况下,找到类似于 Web 请求的合适范围
  • 尽可能抽象以避免服务定位器模式

我想到了选择一个 Form 作为作用域,例如,如果我注入(inject)一个 View 模型或一个存储库,它应该在表单关闭时被释放,等等。这样我可以在我的 Form 中使用构造函数注入(inject),就像在 Web 应用程序中的 Controller 中一样。例如

public class UserEditForm : Form {

private reaodnly UserEditViewModel viewModel;

public UserEditForm(UserEditViewModel viewModel) {
this.viewModel= viewModel;
}

public void Load(int userId) {
this.viewModel.Load(userId);
}

...
}

public class UserEditViewModel {

private readonly UserRepository repository;

public UserEditViewModel(UserRepository repository) {
this.repository = repository;
}

...
}

为了尽可能避免服务定位器模式,我设计了一个IFormFactory接口(interface),看起来就这么简单。

public interface IFormFactory
{
Form CreateForm(Type formType);
}

我决定允许通过 UI 层(但仅限于此)静态访问此静态类,因此我实现了以下静态类。

public static class FormFactory
{
private static IFormFactory factory;

public static void Use(IFormFactory factory)
{
if (FormFactory.factory != null)
{
throw new InvalidOperationException(@"Form factory has been already set up.");
}

FormFactory.factory = factory;
}

public static Form Create(Type formType)
{
if (factory == null)
{
throw new InvalidOperationException(@"Form factory has not been set up. Call the 'Use' method to inject an IFormFactory instance.");
}

return factory.CreateForm(formType);
}

public static T Create<T>() where T : Form
{
return (T)Create(typeof(T));
}
}

现在我抽象了表单的创建过程。请注意,在此之前我什至不关心任何潜在的 DI 容器。在这里,我已经可以开始重构整个 View 层以使用此模式,例如像这样。

using (var form = FormFactory.Create<UserEditorForm>()) {
form.Load(userId);
form.ShowDialog();
}

Autofac(或任何其他 DI 容器)出现了。我已经像这样使用 Autofac 实现了 IFormFactory

public class AutofacFormFactory : IFormFactory
{
private readonly ILifetimeScope currentScope;

public AutofacFormFactory(ILifetimeScope currentScope)
{
this.currentScope = currentScope;
}

public Form CreateForm(Type formType)
{
// begin a new lifetime scope for each form instance
var scope = this.currentScope.BeginLifetimeScope();

var form = (Form) scope.Resolve(formType);

form.Disposed += (s, e) =>
{
// finish the scope when the form is disposed (closed)
scope.Dispose();
};

return form;
}
}

此外,不要忘记在 Autofac 配置中包含绑定(bind)。

builder.RegisterType<AutofacFormFactory>().As<IFormFactory>();

最后我像这样在 Program.cs 中初始化了这一切。

var builder = new ContainerBuilder();

builder.RegisterModule<MyModule>();

var container = builder.Build();

FormFactory.Use(container.Resolve<IFormFactory>());

希望它仍然可以对任何人有所帮助。

关于c# - 是否有用于 WinForm 的 Autofac 集成库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27763242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com