使用 Autofac 解析 XAML 中的依赖项

本文关键字:依赖 XAML Autofac 解析 使用 | 更新日期: 2023-09-27 18:33:23

我的应用程序中有一个类MyResource,如下所示:

public class MyResource : IMyResource
{
    // ... whatever ...
}

当我在 App.xaml 中初始化我的应用程序时.cs我使用 Autofac 有类似的东西:

builder.Register<IMyResource>(container => new MyResource());

现在,我需要在 WPF 应用程序的Window中添加一个StaticResource,如下所示:

<Window.Resources>
    <local:MyResource x:Key="MyResource" />
</Window.Resources>

但是,当然,整个想法并不是在这里引用MyResource的具体实例。此外,我可能需要在我的应用程序中以不同的WindowUserControl使用MyResource实例。因此,我想使用MyResource实例作为通过 Autofac 容器解析的WindowStaticResource。我怎样才能做到这一点?

我正在考虑将资源添加到我的Window的代码隐藏中,但它可能会对我的容器产生我不想要的依赖。

当我初始化应用程序时,我也在考虑在 App.xaml.cs 中做类似的事情:

App.Current.MainWindow.Resources.Add("MyResource", container.Resolve<IMyResource>());

但是当我在 XAML 中使用资源时

<ListBox ItemsSource="{Binding Source={StaticResource ResourceKey=MyResource}}"/>

我收到一个XAMLParseException,其中内部异常的消息指出找不到名为 MyResource 的资源。即使它有效,我也觉得它有点臭。

那么如何才能做到这一点呢?只有可能吗?如果不是,实现这一点的最佳方法是什么?

使用 Autofac 解析 XAML 中的依赖项

按照以下步骤操作

  • 向Autofac注册MyWindowMyResource
  • IMyResource放在 MyWindow 的构造函数中(是的,您正在修改隐藏的代码,但您没有引用您的容器。 如果你不能在代码隐藏中拥有代码——也许你是一个用户控件——那么请确保有人在某处设置DataContext(
  • DataContext设置为IMyResource的具体实例(在构造函数中(,或者如果您使用的是 MVVM,请将该实例放入您的视图模型(该模型也将注册到 Autofac 中(。
  • 解决MyWindow

在代码中:

MyWindow(IMyResource myResource) : this()
{
  DataContext = myResource;
}

如果您使用的是 ViewModel(也在 Autofac 中注册(:

MyWindow(MyViewModel viewModel) : this()
{
  DataContext = viewModel;
}

将此行添加到 XAML 中:

<Window.DataContext><local:IMyResource></Window.DataContext>

或者这个:

<Window.DataContext><local:MyViewModel></Window.DataContext>

然后,ListBox的标记变得微不足道:

<ListBox ItemsSource="{Binding}"/>

或者,对于视图模型,例如,作为属性Items,它同样不错:

<ListBox ItemsSource="{Binding Items}"/>