通用技术 在 ASP.NET Core2.0 中注册 Service

SinDynasty · 2018年01月23日 · 1386 次阅读

先声明所要注册的 Service1 和 Service2

public class Service1
{
    public Service1()
    {

    }//Service1()

    public Service1(string String)
    {
        this.String = String;
    }//Service1(string String)

    private string String { get; }

}//class Service1

public class Service2
{
    private Service2()
    {

    }//Service2()

    public Service2(Service1 Service1)
    {
        this.Service1 = Service1;
    }//Service2(Service1 Service1)

    private Service1 Service1 { get; }

}//class Service2

注册 Service 前所需知道的事情

在注册 Service 前,我们需要明白两个事情:1、注册的地方;2、注册的生命周期。

Service 的注册是在 Startup 类中的 ConfigureServices 方法。

ASP.NET Core 中注册 Service 的生命周期有 3 种:

1、Transient:每一次提取 Service 时都会创建一个新的 Service 实例;

2、Singleton:在整个应用程序的生命周期中,其将只在第一次提取时创建一个 Service 实例,并保存该实例,即单例模式;

3、Scoped:在同一个 IServiceProvider 中,其将只创建一个 Service 实例,在 MVC 中可以理解为对于同一个 HttpRequest,其将只创建一个 Service 实例;

使用 AddTransient 方法注册 Service 示例

public void ConfigureServices(IServiceCollection ServiceCollection)
{
    Service1 S1 = new Service1("Hello,Service1");
    ServiceCollection.AddTransient<Service1>();
    ServiceCollection.AddTransient((ServiceProvider) => { return S1; });
    ServiceCollection.AddTransient((ServiceProvider) => { Service1 s1 = ServiceProvider.GetService<Service1>(); Service2 S2 = new Service2(s1); return S2; });
}//void ConfigureServices(IServiceCollection ServiceCollection)

1、ServiceCollection.AddTransient(); 该方法将会调用 Service1 类中 public 的无参数构造函数,并进行注册,因此通过该方法注册的 Service1,其 String 属性值为 null;

2、ServiceCollection.AddTransient((ServiceProvider) => { return S1; }); 该方法直接将 S1 这一实例进行注册,因此其 String 的值为"Hello,Service1",而不是 null;

3、ServiceCollection.AddTransient((ServiceProvider) => { Service1 s1 = ServiceProvider.GetService(); Service2 S2 = new Service2(s1); return S2; }); 当我们需要注册的服务依赖于其他的服务时,我们可以通过 IServiceProvider 这一接口的 GetService 方法进行获取,从而完成相应的注册。如示例中,我通过 IServiceProvider 接口的 GetService 方法提取出注册的 Service1,并将提取出的 Service1 带入 Service2 的构造函数中,进而返回相应的 Service2,并完成 Service2 的注册;

备注:当我们通过ServiceCollection.AddTransient((ServiceProvider) => { return S1; });将 Service1 注册后,我们再使用ServiceCollection.AddTransient(); 这个方法注册 Service2,那 Service2 将会以public Service2(Service1 Service1)构造函数进行注册,因此 Service2.Service1.String 将会为"Hello,Service1",即当 Service 的构造函数中含有相关参数,同时这些参数全部都是其他已经注册了的 Service,那其将会调用该充满已经注册了 Service 参数的构造函数进行注册。

使用 AddSingleton 方法注册 Service 示例

public void ConfigureServices(IServiceCollection ServiceCollection)
{
    Service1 S1 = new Service1("Hello,Service1");
    ServiceCollection.AddSingleton<Service1>();
    ServiceCollection.AddSingleton((ServiceProvider) => { return S1; });
    ServiceCollection.AddSingleton((ServiceProvider) => { Service1 s1 = ServiceProvider.GetService<Service1>(); Service2 S2 = new Service2(s1); return S2; });
}//void ConfigureServices(IServiceCollection ServiceCollection)

其注册的基本方法与 AddTransient 类似。

使用 AddScoped 方法注册 Service 示例

public void ConfigureServices(IServiceCollection ServiceCollection)
{
    Service1 S1 = new Service1("Hello,Service1");
    ServiceCollection.AddScoped<Service1>();
    ServiceCollection.AddScoped((ServiceProvider) => { return S1; });
    ServiceCollection.AddScoped((ServiceProvider) => { Service1 s1 = ServiceProvider.GetService<Service1>(); Service2 S2 = new Service2(s1); return S2; });
}//void ConfigureServices(IServiceCollection ServiceCollection)

其注册的基本方法与 AddTransient 类似。

备注

1、AddTransient、AddSingleton、AddScoped 这 3 个方法均有多个重载,虽然大部分类似,但也有些重载有所不同,在本文中就只介绍了他们各自的 2 个重载,其他的可以自己去查找相应的 API。
2、IServiceProvider是一个很重要的接口,我们可以通过他的 GetService 方法来完成对注册服务的提取。

暫無回覆。
需要 登录 後方可回應,如果你還沒有帳號按這裡 注册