您不能直接在 web.config 中的属性上设置它们,因为属性是在编译时评估的。
但是,您可以做到。
LuisDialog 类构造函数采用 ILuisService 参数。
public LuisDialog(params ILuisService[] services)
现在,ILuisService 有一个适当命名的默认实现 LuisService,它有一个构造函数,该构造函数接受一个 ILuisModel 参数
public LuisService(ILuisModel model)
请耐心等待,我要讲好东西了。 ILuisModel 是在 LuisModelAttribute 类中实现的。
public class LuisModelAttribute : Attribute, ILuisModel, ILuisOptions, IEquatable<ILuisModel>
在 LuisModelAttributes 构造函数中,您应该开始了解它的去向
public LuisModelAttribute(string modelID, string subscriptionKey,
LuisApiVersion apiVersion = LuisApiVersion.V2, string domain = null, double threshold = 0.0d)
这个构造函数接受一个modelId和subscriptionKey!这正是您正在寻找的。
现在,下一个问题是您如何将所有这些放在一起?答案是使用 autofac 进行依赖注入。
我通常为我的所有 DI 注册声明一个新的 Autofac 模型类。
internal sealed class MainModule : Module
我们需要注册的第一件事是 LuisModelAttribute 的一个实例
var luisModelAttr = new LuisModelAttribute(ConfigurationManager.AppSettings["luis:AppId"],
ConfigurationManager.AppSettings["luis:ServiceKey"],
LuisApiVersion.V2,
ConfigurationManager.AppSettings["luis:APIHostName"])
{
BingSpellCheckSubscriptionKey = ConfigurationManager.AppSettings["luis:BingSpellCheckKey"],
SpellCheck = true
}
这并没有注册任何东西,它只是创建了一个 LuisModelAttribute 类的实例。现在,注册它。
builder.Register(c => luisModelAttr).AsSelf().AsImplmentedInterface().SingleInstance();
接下来,注册你的 Luis 对话框,你需要在构造函数参数中包含 ILuisService
builder.Register(c => new MyLuisDialog(c.Resolve<ILuisService>())
.As<IDialog<IMessageActivity>>()
.InstancePerDependency();
LuisService 的最后一次注册,或者在我们的例子中是 ILuisService
builder.RegisterType<LuisService>()
.Keyed<ILuisService>(FiberModule.Key_DoNotSerilialize)
.AsImplementedInterface()
.SingleInstance();
那么,这里发生了什么?因为 LuisModelAttribute 实现了 ILuisModel,Autofac 会知道将 LuisModelAttribute 作为 LuisService 的参数包含在内,并且会知道将实现 ILuisService 的 LuisService 包含到我们的 luis 对话框 MyLuisDialog 中。
您的具体实现可能会有所不同,但此示例将为您提供所需的内容。祝你好运!