当我们需要,基于名称的注入,属性注入,子容器。 基于动态代理的AOP.
做为新手,先蒙b 一下下
1 初体验。
1.1 nudget 安装扩展
1.2 注入操作。
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
//注册方法有点不一样。
containerBuilder.RegisterType<MyService2>().As<IMyService>().InstancePerLifetimeScope();
});
1.3 使用。
public WeatherForecastController( IMyService myService )
{
_myService = myService;
}
Console.WriteLine($"_myService {_myService.ToString()} code{_myService.GetHashCode()} ");
2 获取命名的服务 。
builder.RegisterType<MyService>().As<IMyService>();
//注册命名服务 。
builder.RegisterType<MyServiceV2>().Named<IMyService>("service2");
//startup.cs 拿服务,并输出。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
var service = this.AutofacContainer.ResolveNamed<IMyService>("service2");
service.show();
//取非命名的。
var serviceOrig = this.AutofacContainer.ResolveNamed<IMyService>("service2");
serviceOrig.show();
3 属性注入。
builder.RegisterType<MyServiceV2>().Named<IMyService>("service2").PropertiesAutowired();
//注意,要将注入的属性类,也注入为服务 。
builder.RegisterType<MyService>().As<IMyService>();
4 Aop 场景 。(不改变原有类的情况下,在切面上执行业)
4.1 写拦截器。
using Castle.DynamicProxy;
namespace p1.Services
{
public class AopCache : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine($"ApoCache Intercept start {invocation.Method.Name}");
invocation.Proceed();
Console.WriteLine("ApoCache Intercept end {invocation.ReturnValue}");
}
}
}
4.2 开启拦截器。 (接口)
builder.Host.ConfigureContainer<ContainerBuilder>(builder => {
builder.RegisterType<AopCache>();
//这里是接口拦截器。
builder.RegisterType<MyService>().As<IMyService>().InterceptedBy(typeof(AopCache)).EnableInterfaceInterceptors();
});
4.3 实现一个类拦截器。
1 建个类,然后设置好拦截器。注册是虚方法 。
using Autofac.Extras.DynamicProxy;
namespace p1.Services
{
[Intercept(typeof(AopCache))]
public class GetDataClass
{
virtual public string GetTime()
{
Console.WriteLine("here is GetDataClass.GetTime");
return DateTime.Now.ToString("G");
}
}
}
//programe.cs 中注册进去。
builder.RegisterType<GetDataClass>().EnableClassInterceptors();
5 子容器。
1 注册到子容器中。
找到父容器。
using (var myscope = AutofacContainer.BeginLifetimeScope("myscope"))
{
var s0 = myscope.Resolve<MyNameService>();
....
}
当不期望在根容器创建,又希望在某范围内单例时,可以做如下处理。
官网又tmd 打不开,坑多心累。