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();
}
}
}
}