I was looking through some code in an ASP.NET Core application and I noticed the repository services are added with AddScope, while in mine i am using addTransient. I have looked about the difference but i still do not understand how would this change my actual applicationn.
this is the code i am using and the services i use on pages for Get / Post actions.
services.AddHttpContextAccessor();
services.AddSingleton<IFileProvider>(new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/files")));
services.AddTransient<IAuthorizationHandler, HasArranqueActivoHandler>();
services.AddTransient<IAuthorizationHandler, HasArranqueInactivoHandler>();
services.AddTransient<IAuthorizationHandler, IsParagemNotOnGoingHandler>();
services.AddTransient<IAuthorizationHandler, IsParagemOnGoingHandler>();
services.AddTransient<Services.Interfaces.IUserService, Services.UserService>();
#region AreaProduction
services.AddTransient<Production.Interfaces.IComponenteService, Production.ComponenteService>();
services.AddTransient<Production.Interfaces.IReferenciaService, Production.ReferenciaService>();
services.AddTransient<Production.Interfaces.IProducaoRegistoService, Production.ProducaoRegistoService>();
services.AddTransient<Production.Interfaces.IParagemService, Production.ParagemService>();
services.AddTransient<Production.Interfaces.ICelulaService, Production.CelulaService>();
services.AddTransient<Production.Interfaces.IUapService, Production.UapService>();
services.AddTransient<Production.Interfaces.ICelulaTipoService, CelulaTipoService>();
services.AddTransient<Production.Interfaces.IMatrizService, MatrizService>();
services.AddTransient<Production.Interfaces.IOperadorService, Production.OperadorService>();
services.AddTransient<Production.Interfaces.IEtiquetaService, Production.EtiquetaService>();
services.AddTransient<Production.Interfaces.IPokayokeService, Production.PokayokeService>();
services.AddTransient<Production.Interfaces.IGeometriaService, Production.GeometriaService>();
services.AddTransient<Production.Interfaces.IEmpregadoService, Production.EmpregadoService>();
services.AddTransient<Production.Interfaces.IPecaService, Production.PecaService>();
services.AddTransient<Production.Interfaces.IDefeitoService, Production.DefeitoService>();
#endregion
#region AreaRobotics
services.AddTransient<Robotics.Interfaces.ITurnoService, Robotics.TurnoService>();
services.AddTransient<Robotics.Interfaces.ICelulaService, Robotics.CelulaService>();
services.AddTransient<Robotics.Interfaces.ICheckListService, Robotics.CheckListService>();
services.AddTransient<Robotics.Interfaces.IProducaoService, Robotics.ProducaoService>();
services.AddTransient<Robotics.Interfaces.IReferenciaService, Robotics.ReferenciaService>();
services.AddTransient<Robotics.Interfaces.IDefeitoService, Robotics.DefeitoService>();
services.AddTransient<Robotics.Interfaces.IDefeitoCodigoService, Robotics.DefeitoCodigoService>();
services.AddTransient<Robotics.Interfaces.IParagemService, Robotics.ParagemService>();
services.AddTransient<Robotics.Interfaces.IParagemCodigoService, Robotics.ParagemCodigoService>();
services.AddTransient<Robotics.Interfaces.IPecaService, Robotics.PecaService>();
services.AddTransient<Robotics.Interfaces.IUapService, Robotics.UapService>();
services.AddTransient<Robotics.Interfaces.IOperadorService, Robotics.OperadorService>();
#endregion
#region AreaRobotics
services.AddTransient<Areas.Robotics.Services.Interfaces.ITurnoService, Areas.Robotics.Services.TurnoService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.ICelulaService, Areas.Robotics.Services.CelulaService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.ICheckListService, Areas.Robotics.Services.CheckListService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IProducaoService, Areas.Robotics.Services.ProducaoService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IReferenciaService, Areas.Robotics.Services.ReferenciaService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IDefeitoService, Areas.Robotics.Services.DefeitoService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IDefeitoCodigoService, Areas.Robotics.Services.DefeitoCodigoService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IParagemService, Areas.Robotics.Services.ParagemService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IParagemCodigoService, Areas.Robotics.Services.ParagemCodigoService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IPecaService, Areas.Robotics.Services.PecaService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IUapService, Areas.Robotics.Services.UapService>();
services.AddTransient<Areas.Robotics.Services.Interfaces.IOperadorService, Areas.Robotics.Services.OperadorService>();
#endregion
I would like to know what the impact of changing from AddTransient to AddScoped for my services in my application
Here is a simple Create page with many transient Services to populate select lists
public class CreateModel : PageModel
{
private readonly IMatrizService _matrizService;
private readonly IReferenciaService _referenciaService;
private readonly IUapService _uapService;
private readonly ICelulaTipoService _celulaTipoService;
private readonly ICelulaService _celulaService;
private readonly IToastNotification _toastNotification;
private readonly ILogger<CreateModel> _logger;
public CreateModel(IToastNotification toastNotification,
ICelulaTipoService celulaTipoService,
ICelulaService celulaService,
IUapService uapService,
IReferenciaService referenciaService,
IMatrizService matrizService,
ILogger<CreateModel> logger)
{
_matrizService = matrizService;
_referenciaService = referenciaService;
_uapService = uapService;
_celulaTipoService = celulaTipoService;
_celulaService = celulaService;
_toastNotification = toastNotification;
_logger = logger;
}
[BindProperty]
public Matriz Matriz { get; set; }
public void OnGet()
{
ViewData["CelulaId"] = new SelectList(_celulaService.GetAllFromCache(), "Id", "Nome");
ViewData["UAPId"] = new SelectList(_uapService.GetAllFromCache(), "Id", "Nome");
ViewData["ReferenciaId"] = new SelectList(_referenciaService.GetAllFromCache(), "Id", "Nome");
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
ViewData["CelulaId"] = new SelectList(_celulaService.GetAllFromCache(), "Id", "Nome");
ViewData["UAPId"] = new SelectList(_uapService.GetAllFromCache(), "Id", "Nome");
ViewData["ReferenciaId"] = new SelectList(_referenciaService.GetAllFromCache(), "Id", "Nome");
_toastNotification.AddErrorToastMessage("Falha ao criar Matriz. Verifique os dados novamente.");
return Page();
}
_matrizService.Add(Matriz);
try
{
await _matrizService.SaveChangesAsync();
}
catch (DbUpdateException e)
{
//This either returns a error string, or null if it can’t handle that error
_logger.LogError($@"Falha ao Adicionar Referência
Area: Administration
Page: Account/Robotics/Referencias/Create
Error: {e.InnerException}");
_toastNotification.AddErrorToastMessage($"A Matriz com a Referência {Matriz.Referencia.Nome} já existe");
return Page();
}
_toastNotification.AddSuccessToastMessage("Matriz criada com sucesso.");
return RedirectToPage("./Index");
}
}
Most of my services are usually the same with crud methods
public interface IUserService
{
IQueryable<User> GetAll();
User GetById(int id);
void Add(User user);
void Update(User user);
int AddAndSave(User user);
int SaveChanges();
int UpdateDateAndSave(User user);
User GetByUsername(string username);
}
public class UserService : IUserService
{
private readonly DatabaseContext _context;
public UserService(DatabaseContext context)
{
_context = context;
}
public void Add(User user)
{
_context.Users.Add(user);
}
public int AddAndSave(User user)
{
_context.Users.Add(user);
return _context.SaveChanges();
}
public IQueryable<User> GetAll()
{
return _context.Users.AsNoTracking();
}
public User GetById(int id)
{
return _context.Users.Find(id);
}
public User GetByUsername(string username)
{
return _context.Users
.Include(u => u.Colaborador)
.Include(u => u.UserRoles)
.ThenInclude(ur => ur.Role)
.AsNoTracking()
.FirstOrDefault(u => u.Username == username);
}
public int SaveChanges()
{
return _context.SaveChanges();
}
public void Update(User user)
{
_context.Users.Update(user);
}
public int UpdateDateAndSave(User user)
{
user.DataSessao = DateTime.Now;
_context.Users.Attach(user);
_context.Entry(user).Property(u => u.DataSessao).IsModified = true;
return _context.SaveChanges();
}
}
AddScoped
) are created once per client request (connection). Transient lifetime services (AddTransient
) are created each time they're requested from the service container. What is your actual question? – mm8using Areas.Robotics.Services;
to this file, it would make the code a little more readable :) – DavidG