我似乎无法找到解决这个问题的方法。我已经看到了几个与此相关的问题,但没有一个真正给我解决方案。我对 Autofac 完全陌生,并没有真正做过太多 WPF + MVVM,但了解基础知识。
我有一个 WPF 应用程序(使用 ModernUI for WPF),我试图向其中添加 Autofac,但我很难弄清楚如何在所有视图中解析我的服务,因为它们无法访问我的容器。我有一个主视图,这是我的入口点,我在其中设置容器:
public partial class MainWindow : ModernWindow
{
IContainer AppContainer;
public MainWindow()
{
SetUpContainer();
this.DataContext = new MainWindowViewModel();
InitializeComponent();
Application.Current.MainWindow = this;
}
private void SetUpContainer()
{
var builder = new ContainerBuilder();
BuildupContainer(builder);
var container = builder.Build();
AppContainer = container;
}
private void BuildupContainer(ContainerBuilder builder)
{
builder.RegisterType<Logger>().As<ILogger>();
...
}
}
我遇到的问题是弄清楚如何在其他视图中解析记录器和其他服务,其中我通过 ViewModel 构造函数注入所有依赖项,如下所示:
public partial class ItemsView : UserControl
{
private ItemsViewModel _vm;
public ItemsView()
{
InitializeComponent();
IFileHashHelper fileHashHelper = new MD5FileHashHelper();
ILibraryLoader libraryLoader = new LibraryLoader(fileHashHelper);
ILogger logger = new Logger();
_vm = new ItemsViewModel(libraryLoader, logger);
this.DataContext = _vm;
}
}
有些视图有大量的注入参数,这就是我希望 Autofac 介入并帮助我清理问题的地方。
我正在考虑将容器传递给 ViewModel 并将其存储为 ViewModelBase 类上的属性,但我读到这将是一种反模式,即使这样我也不知道这是否会自动解析我的对象在其他 ViewModel 中。
我设法使用 Autofac 构建了一个简单的控制台应用程序
class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Cleaner>().As<ICleaner>();
builder.RegisterType<Repository>().AsImplementedInterfaces().InstancePerLifetimeScope();
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
ICleaner cleaner = container.Resolve<ICleaner>();
cleaner.Update(stream);
}
}
}
但这很简单,因为它只有一个入口点。
我想要一些有关如何将 Autofac 添加到我的 WPF 应用程序的想法。我确信我做错了什么。感谢您的帮助。