作为整个框架的核心部分,本组件提供了常用的扩展方法、帮助类和自动依赖注入能力
本功能在官方的依赖注入基础上实现,如果对依赖注入不熟悉,可查阅官方文档ASP.NET Core 依赖注入
特性注入和命名约定注入作为基础的注入方式,并提供了自定义扩展注册器的能力
[Dependency(ServiceLifetime.Singleton)]
public class AppServices : IAppServices
{
}
or
public class AppServices : ITransientDependency
{
}其中,通过特性定义的服务生命周期优先级大于使用接口定义的生命周期
在注入容器的时候,可选择是新增、覆盖、如果存在则不注入三种方式,如下
[Dependency(ServiceLifetime.Singleton, RegisterType.Replace)]
public class BAppServices : IAppServices
{
}RegisterType是枚举类型,有三个值,对应三种注入方式,分别是Normal,TryAdd,Replace
通过特性ExposeServicesAttribute来定义需要暴露的服务接口或者服务自身
public class DefaultDerivedService : IDerivedService
{
}
[ExposeServices(typeof(IService))]
public interface IDerivedService : IService
{
}
public interface IService
{
}
[Fact]
public void Should_Get_ExposedServices_By_Conventional()
{
var exposedServices = ExposedServiceExplorer.GetExposedServices(typeof(DefaultDerivedService));
exposedServices.Count.ShouldBe(3);
exposedServices.ShouldContain(typeof(DefaultDerivedService));
exposedServices.ShouldContain(typeof(IService));
exposedServices.ShouldContain(typeof(IDerivedService));
}如上图所示,将会以三个类型暴露服务DefaultDerivedService
如果不在服务上使用ExposeServicesAttribute特性,将按照以下约定暴露服务
- 服务自身
- 同名的所有接口,如
AppServices: IAppServices: IServices,则使用IAppServices和IServices暴露AppServices服务
如果在服务上使用ExposeServicesAttribute特性,则暴露从构造函数传入的服务,并根据特性属性IncludeSameNameInterface、IncludeItself来决定是否暴露服务自身和同名接口
1.初始化自动注入注册器
var services = new ServiceCollection();
services.AddConventionalRegistrar(new DefaultConventionalRegistrar());- 使用扩展方法注入即可
services.AddAssemblyOf<CustomConventionalRegistrarTests>();
services.AddTypes(typeof(MyCustomClass), typeof(MyClass), typeof(MyNonRegisteredClass));
services.AddType<AppServices>();- 定义注册器
public class MyCustomConventionalRegistrar : ConventionalRegistrarBase
{
public override void AddType(IServiceCollection services, Type type)
{
if (type == typeof(MyClass))
{
services.AddSingleton<MyCustomClass>();
}
}
}- 在自动注入前,添加注册器到
ServiceCollection中
var services = new ServiceCollection();
services.AddConventionalRegistrar(new MyCustomConventionalRegistrar());