自注册课程

时间:2017-07-04 13:26:42

标签: c# .net aws-lambda alexa alexa-skills-kit

我目前正在开始使用C#开发Alexa技能。因为我不希望有一个混乱的if块检查传入请求的意图类型我得到了以下想法: 编写一个静态类 RequestHandler ,它存储所有可能意图的列表( IIntent 接口的列表,它将由表示意图的类实现)。

我知道有概念问题,我不知道注册这些意图的最佳方法是什么。我的第一个想法就是写

internal static void RegisterIntent(IIntent intent) => Intents.Add(intent);

并在每个intent的静态构造函数中调用它。此时我不知道静态构造函数只会在第一次访问类时执行。所以这个想法并没有像我想的那样奏效。 我知道的其他想法可以想到:

  • 向每个intent类添加一个静态Initialize / Register方法,在该intent类中创建一个将被添加到静态intent列表中的实例 - >这将导致我必须手动添加到执行的lambda函数的许多initiliaze方法。
  • 向静态RequestHandler添加Initialize方法,该方法将每个intent类的实例添加到静态列表中 - >我仍然需要为每个intent类手动编写 RegisterIntent(new ABCIntent())命令。

有没有办法将所有意图类添加到静态列表中,而无需手动添加此注册操作的代码?还是有更好的方法来实现这一点,而不是我迄今为止的那两个?也许有反思(tbh:我对AWS lamda开发很新,我不知道这是否有用)。

1 个答案:

答案 0 :(得分:0)

我同时用反射改变了注册。所以我可以在请求处理程序的静态构造函数中搜索实现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);
            }
        }
    }

或者有更好的建议吗?