NetCoreはデフォルトIOCコンテナAutoFacを置き換えるために使用しました

.NETのコアは、デフォルトを使用して容器に注入しましたMicrosoft.Extensions.DependencyInjection
インストールパッケージ
AutoFacバージョン4.8.1
Autofac.Extensions.DependencyInjectionバージョン4.3.1

私たちは、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
修正モジュールのクラス

    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