C# 如何将依赖项注入App.xaml.cs?
我没有找到任何类似的例子,所以我决定问这个问题 我正在使用Autofac注册我的服务层接口,我想知道,我可以在App.xaml.cs中注入一个吗 我有自己的日志服务,我希望在应用程序出现致命错误时运行该服务 据我所知,您可以采用类似的方式,我可以在App.xaml.cs中也这样做吗 奥托法克国际奥委会:C# 如何将依赖项注入App.xaml.cs?,c#,wpf,dependency-injection,autofac,C#,Wpf,Dependency Injection,Autofac,我没有找到任何类似的例子,所以我决定问这个问题 我正在使用Autofac注册我的服务层接口,我想知道,我可以在App.xaml.cs中注入一个吗 我有自己的日志服务,我希望在应用程序出现致命错误时运行该服务 据我所知,您可以采用类似的方式,我可以在App.xaml.cs中也这样做吗 奥托法克国际奥委会: public class BootStrapper { /// <summary> /// IoC container ///
public class BootStrapper
{
/// <summary>
/// IoC container
/// </summary>
/// <returns></returns>
public static IContainer BootStrap()
{
var builder = new ContainerBuilder();
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>().SingleInstance();
builder.RegisterType<LogService>()
.As<ILogService>().SingleInstance();
builder.RegisterType<DeleteView>().AsSelf();
builder.RegisterType<DeleteViewModel>().AsSelf().SingleInstance();
builder.RegisterType<PhraseView>().AsSelf();
builder.RegisterType<PhraseViewModel>().AsSelf().SingleInstance().WithParameter(new NamedParameter("searchPhrase", ""));
builder.RegisterType<PopulateDictionaries>().AsSelf().SingleInstance();
return builder.Build();
}
}
如果要向应用程序类注入依赖项,则应定义自定义主方法,在其中实例化应用程序类:
如果执行此操作,请记住将App.xaml的生成操作从ApplicationDefinition更改为Page。如果要向App类注入依赖项,则应定义自定义主方法,在其中实例化App类:
如果执行此操作,请记住将App.xaml的构建操作从ApplicationDefinition更改为Page。对于最先加载/执行的位置,我通常会显式调用DependencyContainer来解析任何依赖项。您是否尝试过这样做,而不是从构造函数中进行注入?这可能会对您有所帮助:问题是您正在尝试在设置容器之前进行注入。大多数DI框架都需要一次性配置容器,这通常是在应用程序启动时,也就是您遇到此问题的地方。我没有提到,我已经为注册依赖项和视图添加了IoC+VM代码。现在代码正在编译并没有引发异常。但我不确定App.xaml.cs的DI构造函数是否会在未处理异常的情况下使用。我需要在这个类中使用LogService的singleton。WPF只有两种不同的启动方式,我相信1种完全通过XAML启动,没有应用程序代码落后,2种应用程序代码落后。对于后者,我看不出在没有为第一个加载/执行的位置设置DI yetFor的情况下如何注入AppILogService日志,我通常会显式调用DependencyContainer来解析任何依赖项。您是否尝试过这样做,而不是从构造函数中进行注入?这可能会对您有所帮助:问题是您正在尝试在设置容器之前进行注入。大多数DI框架都需要一次性配置容器,这通常是在应用程序启动时,也就是您遇到此问题的地方。我没有提到,我已经为注册依赖项和视图添加了IoC+VM代码。现在代码正在编译并没有引发异常。但我不确定App.xaml.cs的DI构造函数是否会在未处理异常的情况下使用。我需要在这个类中使用LogService的singleton。WPF只有两种不同的启动方式,我相信1种完全通过XAML启动,没有应用程序代码落后,2种应用程序代码落后。对于后者,我看不出在没有设置DI的情况下如何注入AppILogService日志yet@bakunet:你试过这个还是发生了什么?这是一种注入App类的方式,显然与downvoter的想法相反:@bakunet:你尝试过这个还是发生了什么?这是注入App类的方式,显然与downvoter的想法相反:
public class BootStrapper
{
/// <summary>
/// IoC container
/// </summary>
/// <returns></returns>
public static IContainer BootStrap()
{
var builder = new ContainerBuilder();
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>().SingleInstance();
builder.RegisterType<LogService>()
.As<ILogService>().SingleInstance();
builder.RegisterType<DeleteView>().AsSelf();
builder.RegisterType<DeleteViewModel>().AsSelf().SingleInstance();
builder.RegisterType<PhraseView>().AsSelf();
builder.RegisterType<PhraseViewModel>().AsSelf().SingleInstance().WithParameter(new NamedParameter("searchPhrase", ""));
builder.RegisterType<PopulateDictionaries>().AsSelf().SingleInstance();
return builder.Build();
}
}
public class ViewModelLocator
{
IContainer _container;
public ViewModelLocator()
{
_container = BootStrapper.BootStrap();
}
//view models below
}
public class Program
{
[STAThread]
public static void Main(string[] args)
{
ILogService logService = ...;
App app = new App(logService);
app.InitializeComponent();
app.Run();
}
}