自助注册 类
Self registering Classes
我目前正在开始使用 C# 开发 Alexa Skill。因为我不想在检查传入请求的意图类型时出现混乱,所以我想到了以下想法:
编写一个静态 class RequestHandler 存储所有可能意图的列表(IIntent 接口的列表将由 classes 代表一个意图)。
我知道有概念上的问题,我不知道注册这些意图的最佳方式是什么。我的第一个想法是只写
internal static void RegisterIntent(IIntent intent) => Intents.Add(intent);
并在每个意图的静态构造函数中调用它。在这一点上,我不知道静态构造函数只会在第一次访问 class 时执行。所以这个想法并没有像我想的那样奏效。
我所知道的其他想法是:
- 为每个意图添加一个静态初始化/注册方法class,在其中创建一个实例,该实例将被添加到静态意图列表中 --> 这将导致我有很多初始化方法手动添加到已执行的 lambda 函数。
- 向静态 RequestHandler 添加 Initialize 方法,这会将每个意图 class 的实例添加到静态列表 --> 我仍然需要手动编写 RegisterIntent(new ABCIntent ()) 每个意图的命令 class.
有没有一种方法可以将所有意图 classes 添加到静态列表中,而无需为此注册操作手动添加代码?还是有比我目前使用的那两种方法更好的方法来实现这一目标?也许反思一下(说实话:我对 AWS lamda 开发还很陌生,我不知道这是否可行)。
我同时使用反射更改了注册。所以我可以在请求处理程序的静态构造函数中搜索所有实现 IIntent
接口的 类。
static RequestHandler()
{
var assembly = typeof(RequestHandler).GetTypeInfo().Assembly;
foreach (var t in assembly.GetTypes())
{
if (t.GetInterfaces().Contains(typeof(IIntent)))
{
Intents.Add(Activator.CreateInstance(t) as IIntent);
}
}
}
或者有什么更好的方案吗?
我目前正在开始使用 C# 开发 Alexa Skill。因为我不想在检查传入请求的意图类型时出现混乱,所以我想到了以下想法: 编写一个静态 class RequestHandler 存储所有可能意图的列表(IIntent 接口的列表将由 classes 代表一个意图)。
我知道有概念上的问题,我不知道注册这些意图的最佳方式是什么。我的第一个想法是只写
internal static void RegisterIntent(IIntent intent) => Intents.Add(intent);
并在每个意图的静态构造函数中调用它。在这一点上,我不知道静态构造函数只会在第一次访问 class 时执行。所以这个想法并没有像我想的那样奏效。 我所知道的其他想法是:
- 为每个意图添加一个静态初始化/注册方法class,在其中创建一个实例,该实例将被添加到静态意图列表中 --> 这将导致我有很多初始化方法手动添加到已执行的 lambda 函数。
- 向静态 RequestHandler 添加 Initialize 方法,这会将每个意图 class 的实例添加到静态列表 --> 我仍然需要手动编写 RegisterIntent(new ABCIntent ()) 每个意图的命令 class.
有没有一种方法可以将所有意图 classes 添加到静态列表中,而无需为此注册操作手动添加代码?还是有比我目前使用的那两种方法更好的方法来实现这一目标?也许反思一下(说实话:我对 AWS lamda 开发还很陌生,我不知道这是否可行)。
我同时使用反射更改了注册。所以我可以在请求处理程序的静态构造函数中搜索所有实现 IIntent
接口的 类。
static RequestHandler()
{
var assembly = typeof(RequestHandler).GetTypeInfo().Assembly;
foreach (var t in assembly.GetTypes())
{
if (t.GetInterfaces().Contains(typeof(IIntent)))
{
Intents.Add(Activator.CreateInstance(t) as IIntent);
}
}
}
或者有什么更好的方案吗?