ABP源码分析 - 约定注册(2)

比较随意,记录下过程,以便忘了以后重拾。

所谓约定注册是指不需要明确写代码注入,只需要按约定规则写服务类,框架自动完成服务注册。
例如,只要这样写,框架就会自动注册。

public class TaxCalculator : ITaxCalculator, ICanCalculate,ITransientDependency
{
}

如果不用abp,你需要写如下代码进行服务注册

public override void ConfigureServices(ServiceConfigurationContext context)
{
    context.Services.AddTransient<ITaxCalculator, TaxCalculator>();
    context.Services.AddTransient<ICanCalculate, TaxCalculator>();
}

 

context.Services.AddTransient<ITaxCalculator, TaxCalculator>()分解

这句可以分解四个要点:

  1. 操作(AddTransient)。添加时的具体操作,是直接添加,还是替换,或者已经有了就不在添加。
  2. 生命周期(AddTransient)。
  3. 对外的服务ITaxCalculator,ICanCalculate
  4. 服务的实现TaxCalculator

ABP默认的约定注册对应如下:

  1. 操作。默认Add,可以通过Dependency表达TryAdd和Replace
public class DependencyAttribute : Attribute
{
    public virtual ServiceLifetime? Lifetime { get; set; }

    public virtual bool TryRegister { get; set; }

    public virtual bool ReplaceServices { get; set; }

    public DependencyAttribute()
    {

    }

    public DependencyAttribute(ServiceLifetime lifetime)
    {
        Lifetime = lifetime;
    }
}

2.生命周期。既可以通过DependencyAttribute.Lifetime也可以通过ITransientDependency,ISingletonDependency,IScopedDependency三个接口来表达。
ITransientDependency,ISingletonDependency,IScopedDependency三个接口是空的,这种接口叫做标识接口,也可以当做一种元数据,作为辅助描述。
3.对外的服务。通过ExposeServices表示。例如我们希望仅暴露ITaxCalculator,就可以通过ExposeServices明确指定。

[ExposeServices(typeof(ITaxCalculator))]
public class TaxCalculator: ITaxCalculator, ICanCalculate, ITransientDependency
{

}

默认不指定ExposeServices,abp会暴露ITaxCalculator,ICanCalculate,TaxCalculator(没错,自身也会注入)三个服务。

4.服务的实现即类本身。

小结

上边介绍了abp怎样对一次服务的描述,下节上源码。

posted @ 2021-01-17 09:32  pojianbing  阅读(363)  评论(0)    收藏  举报