框架必知必会——Autofac概述及应用

Autofac概述

Autofac 是一个依赖注入框架,它遵循控制反转(Inversion of Control, IoC)原则,通过构造函数注入、属性注入等方式来管理对象的依赖关系。它的核心原理是将对象的创建和生命周期管理交给容器,而不是在代码中手动管理。

Autofac的作用主要有以下几点

  • 解耦:通过依赖注入,将组件的创建和依赖关系从业务逻辑中分离,使代码更加模块化和可维护。
  • 管理生命周期:可以控制对象的生命周期,例如单例、瞬时等,从而优化资源管理。
  • 提高测试性:使单元测试更加容易,因为依赖项可以轻松地替换为模拟对象

 所以主要用到如下几个场景

1)大型项目

2)模块化开发的时候

3)要做单元测试的时候

使用案例

以下介绍一下在WPF中,我们该如何使用这个框架;(如果是其他的MVVM框架,可能已经使用了该框架)

假设我们有一个接口及其实现

public interface IMessageService
{
    string GetMessage();
}

public class MessageService : IMessageService
{
    public string GetMessage()
    {
        return "Hello, Autofac!";
    }
}

 WPF的使用案例

1)在app.xaml.cs中配置Autofac

public partial class App : Application
    {
        private IContainer _container;

        protected override void OnStartup(StartupEventArgs e)
        {
            var builder = new ContainerBuilder();

            // 注册类型
            builder.RegisterType().As();

            _container = builder.Build();

            // 启动主窗口
            var mainWindow = _container.Resolve();
            mainWindow.Show();
        }
    }

 其中,如果要对这个接口做生命周期管理的话,有

// 注册为单例 builder.RegisterType().As().SingleInstance(); // 注册为瞬时 builder.RegisterType().As().InstancePerDependency();

 

// 注册对象在IoC容器中的生命周期触发事件
 builder.RegisterType().As()
     .OnRegistered(e => Console.WriteLine("在注册的时候调用!"))
     .OnPreparing(e => Console.WriteLine("在准备创建的时候调用!"))
     .OnActivating(e => Console.WriteLine("在创建之前调用!"))
     .OnActivated(e => Console.WriteLine("创建之后调用!"))
     /// 
     .OnRelease(e => Console.WriteLine("在释放占用的资源之前调用!"));

那我们注入接口的原因为,当我们实现需要更改的时候,我们就不需要再次更改引用这个接口的类,而是只需要去更改实现这个接口的类即可。这样子就可以很好的解耦掉代码,不影响其他部门。

当我们要应用的时候——》

using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        private readonly IMessageService _messageService;

        public MainWindow(IMessageService messageService)//依赖于接口,而不是实现
        {
            InitializeComponent();
            _messageService = messageService;
            MessageBox.Show(_messageService.GetMessage());
        }
    }
}

其他用到此框架的大同小异,到时候我们看到也就知道啦。

你可能感兴趣的:(WPF,wpf,autofac)