NetCore使用AutoFac替换默认的IOC容器

.Net Core默认采用的注入容器是Microsoft.Extensions.DependencyInjection
安装包
AutoFac 版本4.8.1
Autofac.Extensions.DependencyInjection 版本4.3.1

我们重写StartUp中的ConfigureServices

      public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            
            var containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterModule<AutoFacModule>();
            //将所有需要注入的的类型 交给AutoFac来注册
            containerBuilder.Populate(services);
            var container = containerBuilder.Build();

            return new AutofacServiceProvider(container);

        }

AutoFacModule类,在这里注册类型到容器中

  public class AutoFacModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {

            //builder.RegisterType<MyClassTest>().As<IMyTest>();

        }
    }

接口和实现类:

  public interface IMyTest
    {
        void Sum(int num1, int num2);

        void SayHi();
    }

    public class MyClassTest : IMyTest
    {
        public void SayHi()
        {
            Console.WriteLine("你好");
        }

        public void Sum(int num1, int num2)
        {
            Console.WriteLine("两个数的和是" + (num1 + num2).ToString());
        }
    }

控制器:

   private readonly ILogger<HomeController> logger = null;
        private readonly ILoggerFactory loggerFactory = null;
        private readonly IMyTest myTest = null; 

        public HomeController(ILogger<HomeController> _logger, ILoggerFactory _loggerFactory,IMyTest _myTest)
        {
            logger = _logger;
            loggerFactory = _loggerFactory;
            myTest = _myTest;
        } 
        #endregion

        public IActionResult Index()
        {
            logger.LogInformation("Home/Index 的ILogger注入");
            loggerFactory.CreateLogger<HomeController>().LogWarning("Home/Index 的ILoggerFactory注入");

            myTest.Sum(3, 5);
            myTest.SayHi();

            return View();
        }

//安装包 支持AOP
Autofac.Extras.DynamicProxy 版本4.5.0
修改Module类

    public class AutoFacModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.Register(c => new AutoFacAop());
            builder.RegisterType<MyClassTest>().As<IMyTest>().EnableInterfaceInterceptors();

        }
    }

定义AOP扩展

   /// <summary>
    ///定义AOP 扩展
    /// </summary>
    public class AutoFacAop : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            var arguments = invocation.Arguments;
            Console.WriteLine($"参数{string.Join(",",arguments)}");
            var menthod = invocation.Method.Name;
            Console.WriteLine($"调用的方法是{menthod}");

            //执行方法
            invocation.Proceed();

            //方法执行完以后 在继续执行的codes

            Console.WriteLine("方法执行完毕了");
        }
    }

修改类MyClassTest


    [Intercept(typeof(AutoFacAop))]
    public class MyClassTest : IMyTest
    {
        public void SayHi()
        {
            Console.WriteLine("你好");
        }

        public void Sum(int num1, int num2)
        {
            Console.WriteLine("两个数的和是" + (num1 + num2).ToString());
        }
    }

这样当每次执行MyClassTest 类里面的方法都会先执行AOP里面的代码。

发布了13 篇原创文章 · 获赞 2 · 访问量 491

猜你喜欢

转载自blog.csdn.net/qq_41809137/article/details/103335828