c# - 如何将依赖项注入(inject) App.xaml.cs?

标签 c# wpf dependency-injection autofac

我没能找到任何类似的例子,所以我决定问这个问题。

我正在使用 Autofac 注册我的服务层接口(interface),我想知道,我可以将一个注入(inject)到 App.xaml.cs 中吗?

我有自己的日志服务,我想在应用程序出现 fatal error 时运行它。

据我所知,你可以用类似的方式inject dependency to the window , 我可以在 App.xaml.cs 中做同样的事情吗?

public partial class App : Application
    {
        private readonly ILogService _log;

        public App()
        {

        }

        public App(ILogService log) : this()
        {
            _log = log;
        }

        async Task App_DispatcherUnhandledExceptionAsync(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            _log.Error("App.xaml.cs exception: " + e.Exception.Message);

            await _log.SaveAllLinesAsync();

            e.Handled = true;
        }
    }

Autofac IoC:

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();
        }
    }

IoC 在 ViewModelLocator 中初始化:

public class ViewModelLocator
    {
        IContainer _container;
        public ViewModelLocator()
        {
            _container = BootStrapper.BootStrap();
        }

        //view models below
    }

最佳答案

如果你想给 App 类注入(inject)一个依赖,你应该定义一个自定义的 Main 方法来实例化 App 类:

public class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        ILogService logService = ...;
        App app = new App(logService);
        app.InitializeComponent();
        app.Run();
    }
}

如果这样做,请记住将 App.xamlBuild ActionApplicationDefinition 更改为 Page .

关于c# - 如何将依赖项注入(inject) App.xaml.cs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57684916/

相关文章:

c# - WPF 简单绑定(bind)

dependency-injection - MEF(托管可扩展性框架)与 IoC/DI

c# - 在哪里可以找到 ASP.NET MVC 插件模式的介绍?

c# - 依赖注入(inject) : what do you lose when instantiating concrete classes in parameterless constructor

c#使用反射从派生类中获取私有(private)成员变量

c# - 字符串操作模式(C# 或其他语言)

c# 将图像从 WPF 发送到 WebAPI

c# - 如何使用异步方法正确编写 Parallel.For

c# - 使用 jquery ajax 调用 ASP.NET 静态方法中的输入流来发布表单值

WPF调试数据触发器?