.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.