在.NetCore中使用自带的IOC容器 写注入的时候会写很多,如果要自己封装的话也达不到预期的效果,所以这里采用Autofac来时替代 .NetCore自带的容器
nuget首先引用Autofac.Extensions.DependencyInjection,关联的Autofac包也一起添加上了
这里我对DI类的生命周期做了一些特性处理
在.NetCore自带的容器中 有ScopedSingletonTransient,这里就不对这三个区别做介绍了
我定义了三种特性,对应这三种方式
public class ScopedDIAttribute : Attribute { } public class SingletonDIAttribute : Attribute { } public class TransientDIAttribute : Attribute { }
那么在代码中怎么来使用Autofac注入这些对应特性的生命周期,代码如下
在Startup中ConfigureServices中添加代码,并且修改返回值IServicesProvider ,这里我指定了需要扫描的应用程序集,并且为三种特性注入了对应的生命周期
var builder = new ContainerBuilder(); builder.Populate(services); var _assably = AppDomain.CurrentDomain.GetAssemblies(); var _needImpl = _assably.Where(c => c.FullName.StartsWith("ExaminationServicesApplication")
|| c.FullName.StartsWith("ExaminationServicesDomain")
|| c.FullName.StartsWith("ExaminationServicesInfrastructure")).ToArray(); builder.RegisterAssemblyTypes(_needImpl) .Where(t => t.GetCustomAttribute<ScopedDIAttribute>() != null) .AsImplementedInterfaces() .InstancePerLifetimeScope(); builder.RegisterAssemblyTypes(_needImpl) .Where(t => t.GetCustomAttribute<TransientDIAttribute>() != null) .AsImplementedInterfaces() .InstancePerDependency(); builder.RegisterAssemblyTypes(_needImpl) .Where(t => t.GetCustomAttribute<SingletonDIAttribute>() != null) .AsImplementedInterfaces() .SingleInstance(); builder.RegisterDynamicProxy(); this.ApplicationContainer = builder.Build(); return new AutofacServiceProvider(this.ApplicationContainer);
builder.RegisterDynamicProxy(); 这个是对AspectCore 针对 Autofac 实现AOP的处理
做完这些我们只需要在对应的实现类中加入对应的特性即可完成注入,不需要在startup里面大量的写 AddScoped了
[ScopedDI] public class DemoRepository :BaseRepository<School>, IDemoRepository { }