大多数在线示例涉及asp.net,并将其DbContext注册为启动服务注册表的一部分。
我尝试像这样注册我的DbContext
builder.RegisterType<MyContext>()
.As<MyContext>()
.InstancePerLifetimeScope();
builder.RegisterType<DealRepository>()
.Keyed<IRepository<Deal>>(FiberModule.Key_DoNotSerialize)
.As<IRepository<Deal>>()
.SingleInstance();
builder.RegisterType<CardsDialog>()
.As<IDialog<object>>()
.InstancePerDependency();
但我遇到了这个错误
类型 'System.Net.Http.WebRequestHandler' 违反了继承安全性规则。派生类型必须匹配基类型的安全可访问性或者比基类型更低的可访问性。
实际上,MessageController.cs
在 Post
上创建了一个新范围,这使得问题变得更加复杂。
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
{
var dialog = scope.Resolve<IDialog<object>>();
await Conversation.SendAsync(activity, () => dialog);
}
如何完成注册?
编辑:
如建议的那样,使用InstancePerRequest
解决了问题。但是我还有一个每X秒运行一次的Quartz任务,也需要一个存储库。
builder.RegisterType<DealJob>()
.AsSelf()
.SingleInstance();
无法解析类型“BargainBot.Repositories.MyContext”,因为无法定位其所属的生命周期范围。此注册公开了以下服务: - BargainBot.Repositories.MyContext 详细信息--->在请求该实例的作用域中,没有标记匹配“AutofacWebRequest”的作用域可见。如果您在执行 Web 应用程序期间看到这个错误,通常表示正在通过 SingleInstance() 请求注册为每个 HTTP 请求的组件。
我应该在这一点上手动解析一个新的DbContext吗?或者我应该更改我的仓库的生命周期?
编辑2:看起来即使删除整个Quartz作业注册,我仍然会收到这个错误。
Startup.cs
的ConfigureServices
方法中添加你的 DbContext 呢?像这样:services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
然后也在那里添加你的 Repository:services.AddScoped<IDealRepository, DealRepository>();
- kimbaudiStartup.cs
文件,因为我不在asp.net上下文中。这是一个Microsoft Bot Framework应用程序。我会在原问题中澄清。 - martinni39