众所周知,asp.net core有一个di框架,应用程序启动时初始化。

  预定义依赖

1: iapplicationbuilder:提供了配置应用程序的请求管道机制

2:iloggerfactory:次类型提供了创建记录器组件的模式

3:lhostinenvironment:此类型提供管理应用程序运行的web宿主环境的信息。

  注册自定义依赖

为了注册类型,需要让系统知道如何将一个抽象类型解析为一个具体类型,这种映射可以是静态设定,也可以是动态的。

  public void configureservices(iservicecollection services)
        {
            services.addtransient<icustomerservice, customerservice>();
        }

每当请求一个实现了icustomerservice的类型的实例时,系统返回customerservice的一个实例,特别是,addtransient方法确保了每次都会返回customerserivce类型的一个新实例。

静态解析有时候有一定的局限性。事实上,如果需要根据运行时条件将类型t解析为不同的类型,它允许指定一个回调函数来解析依赖

public void configureservices(iservicecollection services)
        {
            services.addtransient<icustomerservice>(provider=> {
                var context = provider.getrequiredservice<ihttpcontextaccessor>();
                if (someruntimeconditionholds(context.httpcontext.user))
                    return new customerservicematchingruntioncondition();
                else
                    return new defaultcustomerservice();
            });
        }

  收集配置数据

我们都知道之前的配置都是用web.config文件类获取配置,那么在core中他们提供了一个更加丰富,复杂的基础结构。

它配置是基于 名称-值 对列表。1:json数据提供程序,2:环境变量提供程序,3:内存提供程序。4:自定义配置提供程序。

关于自定义配置,我们需要实现一个iconfigurationsource接口的类,但是,在实现的时候,还需要引用一个集成自configurationprovider的自定义类

public class mydatabaseconfigsoure : iconfigurationsource
    {
      
        public iconfigurationprovider build(iconfigurationbuilder builder)
        {
            throw new mydatabaseconfigprovider();
        }
    }

public class mydatabaseconfigprovider : configurationprovider
    {
        private const string connectionstring = "";
        public override void load()
        {
            using (var db = new mydatabasecontext(connectionstring))
            {
                //..
            }
        }
    }