NetCore used to replace the default IOC container AutoFac

.Net Core injected into the vessel using the defaultMicrosoft.Extensions.DependencyInjection
Installation package
AutoFac version 4.8.1
Autofac.Extensions.DependencyInjection version 4.3.1

We rewrite StartUp in 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 class, where the type of registration to the vessel

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

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

        }
    }

Interface and implementation class:

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

Controller:

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

// install package supports AOP
Autofac.Extras.DynamicProxy version 4.5.0
Modify Module class

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

        }
    }

Expand the definition of 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("方法执行完毕了");
        }
    }

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

So that when the inside of each execution MyClassTest class method will first perform AOP code inside.

Published 13 original articles · won praise 2 · Views 491

Guess you like

Origin blog.csdn.net/qq_41809137/article/details/103335828