gpt4 book ai didi

asp.net-core - 寻找有关如何在 asp.vnext 中使用 services.add* 的示例

转载 作者:行者123 更新时间:2023-12-01 19:33:54 24 4
gpt4 key购买 nike

我想知道在哪里可以找到示例来解释 services.AddInstanceservices.AddScopedservices.AddSingleton 之间的差异和service.AddTransient

我发现一些文章以通用的方式解释了这一点,但我认为源示例更清楚。

最佳答案

这个问题的范围相当大,但由于您似乎专门寻找 AddScoped 信息,因此我将示例缩小到 Web 应用程序内部的范围。

在 Web 应用程序内 AddScoped 几乎意味着请求的范围。 EntityFramework 在内部使用范围界定,但在大多数情况下它不会影响用户代码,因此我坚持使用用户代码,如下所示。

如果您将 DbContext 注册为服务,并且还注册了范围服务,则对于每个请求,您将获得范围服务的单个实例,您可以在其中解析 DbContext.

下面的示例代码应该会更清楚。一般来说,我建议您按照我在下面展示的方式尝试一下,通过逐步执行调试器中的代码来熟悉其行为。从空的 Web 应用程序开始。请注意,我显示的代码来自 Beta2(因为在 Beta2 中我们添加了 [FromServices] 属性,这使得演示更容易,无论版本如何,底层行为都是相同的。

startup.cs

public void ConfigureServices(IServiceCollection services)
{
// Add EF services to the services container.
services.AddEntityFramework(Configuration)
.AddSqlServer()
.AddDbContext<UserDbContext>();

services.AddScoped<UserService>();

// Add MVC services to the services container.
services.AddMvc();
}

UserDbContext.cs

public class UserDbContext : DbContext
{
public UserService UserService { get; }

public UserDbContext(UserService userService)
{
_userService = userService;
}
}

HomeController.cs

public class HomeController : Controller
{
private UserDbContext _dbContext;
public HomeController(UserDbContext dbContext)
{
_dbContext = dbContext;
}

public string Index([FromServices]UserDbContext dbContext, [FromServices]UserService userService)
{
// [FromServices] is available start with Beta2, and will resolve the service from DI
// dbContext == _ctrContext
// and of course dbContext.UserService == _ctrContext.UserService;

if (dbContext != _dbContext) throw new InvalidOperationException();
if (dbContext.UserService != _dbContext.UserService) throw new InvalidOperationException();
if (dbContext.UserService != userService) throw new InvalidOperationException();

return "Match";
}
}

或者,如果您从另一个服务解析用户服务,这次注册为 transient , transient 服务每次解析时都会有一个新实例,但作用域服务将在< em>请求的范围。

创建新的服务

public class AnotherUserService
{
public UserService UserService { get; }

public AnotherUserService(UserService userService)
{
UserService = userService;
}
}

将以下行添加到startup.cs

services.AddTransient<AnotherUserService>();

并重写HomeController.cs如下 公共(public)类 HomeController : Controller { 私有(private) AnotherUserService _anotherUserService;

    public HomeController(AnotherUserService anotherUserService)
{
_anotherUserService = anotherUserService;
}

public string Index([FromServices]AnotherUserService anotherUserService,
[FromServices]UserService userService)
{
// Since another user service is tranient we expect a new instance
if (anotherUserService == _anotherUserService)
throw new InvalidOperationException();

// but the scoped service should remain the same instance
if (anotherUserService.UserService != _anotherUserService.UserService)
throw new InvalidOperationException();
if (anotherUserService.UserService != userService)
throw new InvalidOperationException();

return "Match";
}
}

关于asp.net-core - 寻找有关如何在 asp.vnext 中使用 services.add* 的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27502223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com