记录一下第一次对autofac第三方IOC容器的使用
- 所需依赖的安装
- Autofac
- Autofac.Extensions.DependencyInjection
- Autofac.Extras.DynamicProxy
- Costle.Core
- 配置使用
在program.cs的main方法里使用autofac
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>();
});
}
- 实现aop注册
上面在main方法里使用了autofac工厂之后,需要在startup.cs文件里添加一个注册方法
public void ConfigureContainer(ContainerBuilder containerBuilder)
{
//containerBuilder.RegisterType<MyService1>().As<IMyService>();
#region 命名注册
//containerBuilder.RegisterType<MyService2>().Named<IMyService>("myserver2");
#endregion
#region 属性注册
//containerBuilder.RegisterType<MyService1>();
//containerBuilder.RegisterType<MyService2>().As<IMyService>().PropertiesAutowired();
#endregion
#region AOP
containerBuilder.RegisterType<Myinterceptor>();
containerBuilder.RegisterType<MyService1>();
containerBuilder.RegisterType<MyService2>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(Myinterceptor)).EnableInterfaceInterceptors();
#endregion
#region 子容器
//containerBuilder.RegisterType<MyService1>().InstancePerMatchingLifetimeScope("myscope");
#endregion
}
这里需要创建两个文件,一个接口,一个拦截器
public interface IMyService
{
void showCode();
}
public class MyService1 : IMyService,IDisposable
{
public void Dispose()
{
}
public void showCode()
{
Console.WriteLine($"MyService1 show hash code:{GetHashCode()}");
}
}
public class MyService2 : IMyService
{
public MyService1 myService1 { get; set; }
public void showCode()
{
Console.WriteLine($"MyService2 show hash code:{GetHashCode()},MyService1是否null:{(myService1 == null).ToString().ToLower()}");
}
}
// 这里需要添加命名空间的引用using Castle.DynamicProxy;
public class Myinterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine($"begin:{invocation.Method.Name}");
invocation.Proceed();
Console.WriteLine($"end:{invocation.Method.Name}");
}
}