【发布时间】:2017-03-04 23:11:17
【问题描述】:
大多数在线示例都处理 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 应用程序的执行过程中看到这种情况,这通常表明一个注册为 per-HTTP 请求的组件正在被 SingleInstance() 请求
此时我应该手动解析一个新的 DbContext 吗?或者也许我应该改变我的回购的生命周期?
Edit2:看起来即使删除整个 Quartz 作业注册,我仍然会收到此错误。
【问题讨论】:
-
您尝试将您的上下文注册为 builder.RegisterType
().InstancePerRequest(); -
为什么不把你的 DbContext 添加到
Startup.cs中的ConfigureServices方法中呢?类似services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));并在那里添加您的存储库:services.AddScoped<IDealRepository, DealRepository>(); -
我没有
Startup.cs,因为我不在 asp.net 上下文中。这是在 MicrosoftBot 框架应用程序中。我会在最初的问题中澄清。 -
您可以尝试为 MyContext 注册 InstancePerLifetimeScope() 而不是 InstancePerRequest()
-
@HaHoang 是的,这就是我最初的问题。
标签: c# entity-framework autofac entity-framework-core botframework