leter etter prøver på hvordan du bruker services.add * i asp.vnext

stemmer
2

Jeg vil gjerne vite hvor jeg kan finne eksempler på forklarer forskjellene mellom services.AddInstance, services.AddScoped, services.AddSingletonog service.AddTransient.

Jeg fant noen artikler som forklarer poenget i en generisk måte, men jeg tror en kilde prøven er mye mer tydelig.

Publisert på 16/12/2014 klokken 10:16
kilden bruker
På andre språk...                            


1 svar

stemmer
5

Omfanget av dette spørsmål er ganske stor, men siden det virker som du er spesielt på jakt etter AddScopedinformasjon jeg snevret prøven ned til scoping inne i en web-applikasjon.

Inne i en web-applikasjon AddScopedvil bety ganske mye omfanget av forespørselen. EntityFrameworker å bruke scoping internt, men det påvirker ikke brukerkode i de fleste tilfeller så jeg stikker med brukerkoden som vist nedenfor.

Hvis du registrerer en DbContextsom en tjeneste, og også registrere en omfangs service, for hver forespørsel du vil få en enkelt forekomst av omfangs tjeneste der du løse DbContext.

Eksempelet koden nedenfor gjør det klarere. Generelt vil jeg anbefale bare prøver det ut slik jeg viser det nedenfor for å bli kjent med oppførselen, ved å tråkke gjennom koden i debugger. Start fra et tomt web-applikasjon. Merk koden jeg viser er fra Beta2 (siden i Beta2 vi lagt den [FromServices]egenskap som gjør det lettere å demonstrere, er det underliggende problemet den samme uavhengig av versjon.

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

Alternativt hvis du løse brukerservice fra en annen tjeneste, denne gangen registrert som forbigående transient tjenesten vil ha en ny forekomst hver gang det er løst, men omfangs tjenesten vil forbli den samme innenfor rammen av forespørselen.

Lag den nye tjenesten

public class AnotherUserService
{
    public UserService UserService { get; }

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

Legg til følgende linjer i startup.cs

services.AddTransient<AnotherUserService>();

Og omskrive HomeController.cs som følger public class 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";
    }
}
Svarte 19/12/2014 kl. 04:55
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more