Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在ServiceStack Core中注册DbContext EF Core?_Entity Framework_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Inversion Of Control_Dbcontext - Fatal编程技术网 servicestack,inversion-of-control,dbcontext,Entity Framework,servicestack,Inversion Of Control,Dbcontext" /> servicestack,inversion-of-control,dbcontext,Entity Framework,servicestack,Inversion Of Control,Dbcontext" />

Entity framework 如何在ServiceStack Core中注册DbContext EF Core?

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

使用EF核心,DbContext被注册为EF服务扩展的作用域。这是可取的,因为DbContext不是线程安全的,因此应该为每个请求创建它

ServiceStack IOC将启动中的任何作用域注册视为单例,这与上述观点相矛盾

一个可能的解决方案是不使用EF Core的服务扩展,但这似乎带来了大量样板代码,降低了可维护性。还有更好的办法吗

--

更新

为了清晰起见,我想提供示例代码

我向DbContext类添加了一个私有Guid,这样我就可以判断是否有新实例。

对于每个命中控制器的请求,BloggingContext中的_实例都会返回一个唯一的值。但是,在ServiceStack服务中使用时,\ u实例始终返回相同的值。

此行为与ServiceStack文档一致,该文档说明在.NET Core Startup中注册的作用域依赖项在ServiceStack中是单例的。但是,这是不可取的,因为我们希望每个请求都创建DbContext

我的解决方案是将DbContext注册移动到AppHost代码中,如下所示

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; }
}