【发布时间】:2017-04-28 21:26:55
【问题描述】:
我似乎无法找到解决此问题的方法。我已经看到了几个关于这个的问题,但没有一个真正给我一个解决方案。我对 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 应用程序中。我确定我做错了什么。感谢您的帮助。
【问题讨论】:
-
我的所有 DI 都使用 Autofac,这是我使用 WPF\MVVM github.com/oriches/Simple.Wpf.DataGrid 的示例
标签: c# wpf mvvm dependency-injection autofac