Scorpio 基础知识
本文概述了了解如何开发 Scorpio 应用的关键主题。
Bootstrapper
Bootstrapper 类主要用于启动应用程序,发现并装载 ScorpioModule 类及其依赖链,完成应用启动前的初始化操作,以及应用程序的生命周期管理。
Bootstrapper 类由 BootStrapper.Create() 方法创建或依赖于 Asp.Net Core 的通用主机构造器。如:
using System;
using System.Security.Principal;
using Microsoft.Extensions.DependencyInjection;
namespace Scorpio.Sample.Console
{
class Program
{
static void Main(string[] args)
{
using (var bootstrapper = Bootstrapper.Create<StartupModule>())
{
bootstrapper.Initialize();
}
}
}
}
或者:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace Scorpio.Sample.AspnetCore
{
public class Program
{
public static void Main(string[] args) => CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).AddBootstrapper<StartupModule>()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Modularity
Modularity 主要由 ScorpioModule 和 DependsOnAttribute 组成。
ScorpioModule 类用于以下目的:
- 配置应用所需服务
- 初始化应用
- 关闭应用时清理应用
服务是应用使用的组件,例如,日志记录组件就是一项服务。请将配置(或注册)服务的代码添加到 ScorpioModule.ConfigureServices() 方法中。
您可以在应用启动之前进行某些初始化操作,例如:创建应用请求处理管道等。请将初始化应用的代码添加到 ScorpioModule.Initialize() 方法中。
您可以在应用关闭之前进行某些清理操作,例如:关闭应用请求处理管道等。请将关闭应用的代码添加到 ScorpioModule.Shutdown() 方法中。
ScorpioModule 使用 DependsOnAttribute 标注 Module 之间的依赖关系。
下面是 ScorpioModule 类示例:
using Scorpio.Modularity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Scorpio.Sample.Application;
namespace Scorpio.Sample.AspnetCore
{
[DependsOn(typeof(ApplicationModule))]
public class StartupModule: ScorpioModule
{
public override void ConfigureServices(ConfigureServicesContext context)
{
context.Services.RegisterAssemblyByConvention();
}
public override void Initialize(ApplicationInitializationContext context)
{
Console.WriteLine($"Module {nameof(SampleModule)} is initialized.");
}
public override void Shutdown(ApplicationShutdownContext context)
{
Console.WriteLine($"Module {nameof(SampleModule)} is shutdown.");
}
}
}
有关详细信息,请参阅 Scorpio 中的应用启动。
Conventional
Conventional 用于对应用 Assembly 中的 Type 执行一些常规操作,如:依赖关系注入、Aspect 注入、Unit Of Work 注入等。
Conventional 主要由以下类、接口及方法组成:
ConventionalAction类,用于对执行一般性操作。ConventionalRegistrar类,用于注册及配置ConventionalAction类。ServiceCollection.AddConventionalRegistrar()方法,用于将ConventionalRegistrar添加到ConventionalRegistrar列表中。ServiceCollection.RegisterAssemblyByConvention()方法,用于对指定的Assembly执行ConventionalAction操作。
在 Scorpio 中,各种自动化操作便是基于 Conventional 设计并实现的。如果您需要实现自己的一般性操作。请实现 ConventionalActionBase 抽象类及 IConventionalRegistrar 接口。
Dependency Injection
Scorpio 的 DependencyInjection 直接依赖于 Asp.Net Core 的 DependencyInjection 组件,主要实现了对服务的自动依赖注入。
您可以通过使用以下接口或 Attribue 实现服务的自动依赖注入:
ISingletonDependency,实现ISingletonDependency的组件将被注册为 Singleton 生命周期的服务。ITransientDependency,实现ITransientDependency的组件将被注册为 Transient 生命周期的服务。IScopedDependency,实现IScopedDependency的组件将被注册为 Scoped 生命周期的服务。ExposeServicesAttribute,通过添加ExposeServicesAttribute特性可以为组件实现更加灵活的依赖注入选项。
如:
class SingletonService:ISingletonService,ISingletonDependency
{
}
[ExposeServices(typeof(IExposedService),ServiceLifetime=ServiceLifetime.Transient)]
class ExposedService:IExposedService
{
}
因 Scorpio 的 DependencyInjection 是基于 Conventional 实现的。所以,您可以通过实现自己的 IConventionalRegistrar 实现更多的自动依赖注入方式。
Options
Scorpio 扩展了 Asp.Net Core 的 Options ,主要是为 Options 的配置添加了 PreConfigure 操作。
如:
public override void ConfigureServices(ConfigureServicesContext context)
{
context.Services.PreConfigure<DataFilterOptions>(options =>
{
options.Configure<ISoftDelete>(f=>f.Expression(d=>d.IsDeleted==false));
});
context.Services.AddSingleton(typeof(IDataFilter<>), typeof(DataFilter<>));
context.Services.RegisterAssemblyByConvention();
}
Aspect
Scorpio 依赖 AspectCore 框架提供AOP能力,并为Aspect提供自动注册的能力。在默认的情况下,Aspect 处于关闭状态,如果您需要打开Aspect ,请在构建 Bootstrapper 时使用 BootstrapperCreationOptions.UseAspectCore() ,在打开 Aspect 后,Scorpio 的 DependencyInjection 将由 AspcectCore 提供。
如:
using System;
using System.Security.Principal;
using Microsoft.Extensions.DependencyInjection;
namespace Scorpio.Sample.Console
{
class Program
{
static void Main(string[] args)
{
using (var bootstrapper = Bootstrapper.Create<StartupModule>(opt=>opt.UseAspectCore()))
{
bootstrapper.Initialize();
}
}
}
}