J'ai besoin d'une logique supplémentaire concernant l'enregistrement de l'utilisateur. J'ai donc écrit ce qui suit:ASP.Net 5 DI + Constructeur d'attribut personnalisé
public class UniqueEmail : ValidationAttribute
{
IApplicationDbContext _context;
public UniqueEmail(IApplicationDbContext context)
{
_context = context;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
int count = _context.Users.Where(u => u.Email == value.ToString() && u.EmailConfirmed == true).Count();
if (count == 0) return ValidationResult.Success;
return new ValidationResult("unique email needed from attribute");
}
}
En Startup.cs
:
services.AddScoped<IApplicationDbContext>(p => p.GetService<ApplicationDbContext>());
Maintenant, comment dois-je passer le IApplicationDbContext
à l'attribut dans la classe ViewModel?
[UniqueEmail(/*?*/)]
public string Email { get; set; }
Généralement, est-ce une bonne idée d'utiliser DI dans le cas? Peut-être qu'il existe d'autres moyens?
Utilisez-vous EF? –
Oui. EF7 avec tous les paramètres par défaut – Slip
Vous [ne devez pas injecter de dépendances dans les attributs] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98). Les attributs doivent être [passifs] (http://blog.ploeh.dk/2014/06/13/passive-attributes/). – Steven