2015-11-16 5 views
0

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?

+0

Utilisez-vous EF? –

+0

Oui. EF7 avec tous les paramètres par défaut – Slip

+2

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

Répondre

0

Étant donné que vous utilisez EF7, vous pouvez utiliser l'annotation de données pour garantir l'unicité du courrier électronique.

[Index("IX_Email", IsUnique = true)] 
public string Email{ get; set; } 

Vous pouvez trouver plus d'informations here