.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里面的代码。