新建项目:AspectCoreExtensions.Sample
<ItemGroup> <PackageReference Include="AspectCore.Extensions.Autofac" Version="2.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" /> </ItemGroup>
Program.cs
using Autofac.Extensions.DependencyInjection; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AspectCoreExtensions.Sample { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } }
Startup.cs
using AspectCore.Configuration; using AspectCore.DependencyInjection; using AspectCore.DynamicProxy; using AspectCore.Extensions.Autofac; using Autofac; using Autofac.Extensions.DependencyInjection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace AspectCoreExtensions.Sample { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddScoped<ITaskService, TaskService>();//或者A } public void ConfigureContainer(ContainerBuilder builder) { var serviceContext = new ServiceContext(); //serviceContext.AddType<ITaskService, TaskService>();//或者B //builder.RegisterType<TaskService>().As<ITaskService>().InstancePerLifetimeScope();//或者C //调用Populate扩展方法在Autofac中注册已经注册到ServiceContainer中的服务(如果有)。注:此方法调用应在RegisterDynamicProxy之前 builder.Populate(serviceContext); //调用RegisterDynamicProxy扩展方法在Autofac中注册动态代理服务和动态代理配置 builder.RegisterDynamicProxy(serviceContext.Configuration, config => { config.Interceptors.AddTyped<MethodExecuteLoggerInterceptor>(Predicates.ForService("*Service")); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } public interface ITaskService { bool Run(); } public class TaskService : ITaskService { public bool Run() { return true; } } public class MethodExecuteLoggerInterceptor : AbstractInterceptor { public override async Task Invoke(AspectContext context, AspectDelegate next) { var stopwatch = Stopwatch.StartNew(); await next(context); stopwatch.Stop(); Console.WriteLine("Executed method {0}.{1}.{2} ({3}) in {4}ms,返回值:{5}", context.ImplementationMethod.DeclaringType.Namespace, context.ImplementationMethod.DeclaringType.Name, context.ImplementationMethod.Name, context.ImplementationMethod.DeclaringType.Assembly.GetName().Name, stopwatch.ElapsedMilliseconds, context.ReturnValue ); } } }
WeatherForecastController.cs
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AspectCoreExtensions.Sample.Controllers { [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private readonly ILogger<WeatherForecastController> _logger; private readonly ITaskService _taskService; public WeatherForecastController(ILogger<WeatherForecastController> logger, ITaskService taskService) { _logger = logger; _taskService = taskService; } [HttpGet] public IActionResult Get() { _taskService.Run(); return Ok(true); } } }