Entity framework 如何在ServiceStack Core中注册DbContext EF Core?
使用EF核心,DbContext被注册为EF服务扩展的作用域。这是可取的,因为DbContext不是线程安全的,因此应该为每个请求创建它 ServiceStack IOC将启动中的任何作用域注册视为单例,这与上述观点相矛盾 一个可能的解决方案是不使用EF Core的服务扩展,但这似乎带来了大量样板代码,降低了可维护性。还有更好的办法吗 -- 更新 为了清晰起见,我想提供示例代码 我向DbContext类添加了一个私有Guid,这样我就可以判断是否有新实例。 对于每个命中控制器的请求,BloggingContext中的_实例都会返回一个唯一的值。但是,在ServiceStack服务中使用时,\ u实例始终返回相同的值。 此行为与ServiceStack文档一致,该文档说明在.NET Core Startup中注册的作用域依赖项在ServiceStack中是单例的。但是,这是不可取的,因为我们希望每个请求都创建DbContext 我的解决方案是将DbContext注册移动到AppHost代码中,如下所示Entity framework 如何在ServiceStack Core中注册DbContext EF Core?,entity-framework,
servicestack,inversion-of-control,dbcontext,Entity Framework,
servicestack,Inversion Of Control,Dbcontext,使用EF核心,DbContext被注册为EF服务扩展的作用域。这是可取的,因为DbContext不是线程安全的,因此应该为每个请求创建它 ServiceStack IOC将启动中的任何作用域注册视为单例,这与上述观点相矛盾 一个可能的解决方案是不使用EF Core的服务扩展,但这似乎带来了大量样板代码,降低了可维护性。还有更好的办法吗 -- 更新 为了清晰起见,我想提供示例代码 我向DbContext类添加了一个私有Guid,这样我就可以判断是否有新实例。 对于每个命中控制器的请求,Blogg
public override void Configure(容器)
{
container.AddScoped(c=>
{
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(连接);
返回新的BloggingContext(optionsBuilder.Options);
});
}
这段代码按照我的预期工作。现在,注入我的BlogService的BloggingContext的每个实例都是唯一的。然而,我发现自己无法再使用在.Net核心启动中非常方便的任何服务集合扩展。例如,我想使用,但无法呼叫
服务
.AddUnitOfWork();
相反,我必须像自己一样连接该库的所有依赖项
public override void Configure(容器)
{
container.AddScoped(c=>
{
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(连接);
返回新的BloggingContext(optionsBuilder.Options);
});
container.addScope();
container.addScope();
container.addScope();
}
您应该能够像任何.NET核心应用程序一样在中注册它:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options =>
options.UseSqlite("Data Source=blog.db"));
}
用于解决ServiceStack的IOC、.NET Core的IOC以外的任何依赖项。我已更新了我的问题,以使其更清楚。你说的是对的,但我认为它没有解决我的问题。但非常感谢你的回答和出色的工作。我非常喜欢ServiceStack。黛米丝,有没有基于编辑的更新?例如,当这些依赖项在asp.net核心容器中注册时,如何在SS服务类中使用每个请求范围的构造函数/属性注入?@Tyson查看v5.5+中的,了解如何访问asp.net核心范围的依赖项。谢谢,但我更希望正常的构造函数注入能够工作,不在服务方法内手动解析请求的关闭。但是nm,我发现了这个:即,我只需要添加
services.AddSingleton()
可能值得在此处更新您的文档:或者您不发布此行为的特定原因是什么?有什么我应该知道的吗?@Tyson ASP.NET Core的HttpContextAccessor
public class BlogsController : Controller
{
private readonly BloggingContext _context;
public BlogsController(BloggingContext context)
{
_context = context;
}
// skip for readability
}
public class BlogService : ServiceStack.Service
{
private readonly BloggingContext _context;
public BlogService(BloggingContext context)
{
_context = context;
}
// skip for readability
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options =>
options.UseSqlite("Data Source=blog.db"));
}
public class MyServices : Service
{
public BloggingContext BloggingContext { get; set; }
}