J'utilise fluentvalidation strong> dans mon projet j'ai 2 questions: em> p>
Comment dois-je gérer fluentvalidation strong> est très bon. Je l'utilise pour Validations simples forts> (comme: la propriété n'est pas vide, etc.). Je pense à faire des validations Si vous l'avez utilisé dans des scénarios similaires, quelle était votre expérience? P>
3 Réponses :
La validation est sans surprise un complexe et dépend généralement de l'architecture de votre application, mais voici mes pensées. P>
Les validateurs doivent être gérés en fonction de vos besoins. Je quitterais généralement des instances de classe statiques de servir généralement des problèmes d'infrastructure telles que des usines ou des constructeurs d'objets. P> li>
Sans aucun doute, la bibliothèque fluentevalidation est excellente. Les problèmes typiques rencontrés par la validation ne résultent pas de la bibliothèque que vous choisissez, mais la manière dont la validation est appliquée. Dans la plupart des applications typiques La validation d'un objet / entité / domaine est contextuelle, la validation dépend entièrement du contexte de l'opération que vous essayez d'effectuer. Par exemple, la validation sur le même objet est probablement différente pour la persistance, la modification d'un attribut, de l'état changeant, de l'ETL, etc. Conservez tout cela à l'esprit, je pense que la validation appartient aussi près que possible de l'opération effectuée. p> li> ol>
Espérons que cela aide. p>
Merci beaucoup @kane. Très utile. :)
J'ai utilisé la flueuretvalidation depuis des années et j'ai demandé et avons compris vos questions. P>
va fou avec ceci, c'est un énorme avantage de la flueuretvalidation, assurez-vous simplement que la dépendance n'est pas coûteuse en ce qui concerne le temps et les ressources. strong> p>
Merci @khalid. Je suis complètement d'accord avec toi.
Je viens de regarder cela moi-même en utilisant l'unité et le MVC 4.
Ce que j'ai vu, c'est que si vous les gardez comme des objets transitoires. La flueuretvalidation créera un nouvel objet de validation pour chaque propriété validée. Donc, une certaine mise en cache est requise. P>
Pour ma mise en cache, j'ai examiné la mise en cache de la demande du validateur. Cela fonctionne bien que tous les composants dépendants sont par demande. (Par demande est le code personnalisé qui stocke un conteneur d'unité enfant sur les collections httpcontext.current.items avec un module HTTP qui détruit / dispose du conteneur enfant à la fin de la demande) P>
Pour choisir entre la demande et les instants singletons du validateur se résument à la manière dont votre utilisation et quel type de dépendances il a et les capacités du continent du CIO. p>
avec unité Vous pouvez créer un validateur singleton et injecter l'usine de service en utilisant un fonctionner à savoir Func Servicefunc. P>
Dans mon cas Chaque fois que j'appelle le servicefunc, le "service" Unity ChildrContiner est récupéré. Ainsi, je peux toujours avoir mon «validateur» défini avec un conteneur -rolledlifetimeMeManager (singleton) et avoir le «service» défini avec HierarchicalifetimeManager (par demande). P>
Un inconvénient de ceci est à chaque fois que le servicefunc est invoqué qu'il doit vérifier et récupérer le service du conteneur enfant. Ce sera la raison la plus probable pour laquelle je reviendrai sur "par demande") p>
Je viens de mettre à jour mon code pour utiliser Servicefunc et le testera aujourd'hui. Je crois que ce sera essai une erreur de trouver la solution appropriée pour vos aplications. P>
ci-dessous est l'usine de validation que j'utilise - au lieu d'utiliser le conteneur Unity (comme la plupart des exemples sur le Web), Je suis injectant le idependencyResolver code> et en l'utilisant pour résoudre mes objets de validateur. P>
public class ValidatorFactory : IValidatorFactory
{
private readonly IDependencyResolver _dependencyResolver;
// taken from the attribute Validation factory
public ValidatorFactory(IDependencyResolver dependencyResolver)
{
_dependencyResolver = dependencyResolver;
}
/// <summary>
/// Gets a validator for the appropriate type.
///
/// </summary>
public IValidator<T> GetValidator<T>()
{
return (IValidator<T>)this.GetValidator(typeof(T));
}
/// <summary>
/// Gets a validator for the appropriate type.
///
/// </summary>
public virtual IValidator GetValidator(Type type)
{
if (type == (Type)null)
return (IValidator)null;
var validatorAttribute = (ValidatorAttribute)Attribute.GetCustomAttribute((MemberInfo)type, typeof(ValidatorAttribute));
if (validatorAttribute == null || validatorAttribute.ValidatorType == (Type) null)
{
return (IValidator) null;
}
else
{
return _dependencyResolver.GetService(validatorAttribute.ValidatorType) as IValidator;
}
}
}
Merci Edys pour votre réponse