Heim > Artikel > Backend-Entwicklung > EF-Architektur – tatsächliche Verwendung von FluentValidation
Zurück zum Verzeichnis
In MVC-, EF- und LINQ-Umgebungen verwenden wir häufig DataModel (DO) und ViewModel (VO). Dies ist natürlich sehr wichtig Intuitiv, sogar die DEMO von Microsoft ist so:
/// <summary>/// 机构ID/// </summary>[DisplayName("机构ID")]public int AgentId { get; set; }/// <summary>/// 机构名称/// </summary>[DisplayName("机构名称")] [MaxLength(128)]public string AgentName { get; set; }/// <summary>/// 机构负责人/// </summary>[DisplayName("机构负责人")] [MaxLength(128)]public string AgentUser { get; set; }
Diese Entwurfsmethode wird viele Probleme für unsere zukünftige Wartung mit sich bringen:
wird mit Datenentitäten gemischt, die von Ihnen hinzugefügten Funktionen gehen möglicherweise verloren, wenn die Entität aktualisiert wird.
Wenn es viele VO gibt Sie müssen es dem spezifischen VO hinzufügen, da die Semantik von DO möglicherweise nicht klar ist
und es für die Migration nicht geeignet ist und zu stark mit ModelState gekoppelt ist
Aus objektorientierter Sicht sind seine Verantwortlichkeiten zu einzeln und verursachen zu viele Variablen
Zusammenfassend lässt sich sagen, dass FluentValidation geboren wurde!
Gehen Sie zu Nuget, um es zu installieren: install-package FluentValidation
Sie können einer Ihrer Entitätsklassen mehrere Inspektionsklassen hinzufügen, was dem Vorhandensein mehrerer Inspektionsklassen entspricht . Eine Entitätsklasse zu dekorieren, finde ich ziemlich gut!
public class CreateUserEventValidator : AbstractValidator<CreateUserEvent>{public CreateUserEventValidator() { RuleFor(command => command.UserName).NotEmpty().Length(5, 20).WithMessage("用户名升序为5-20字符!"); RuleFor(command => command.Email).NotEmpty().EmailAddress().WithMessage("不是有效的Email!"); RuleFor(command => command.BirthDay).NotEmpty().Must(i => i < DateTime.Now).WithMessage("你的年紀太小了!"); } }
Wenn Sie es verwenden, können Sie die benötigten Informationen über Attribute wie IsValid und Errors abrufen. Natürlich können Sie es auch für Befehlsereignisse und Domänenereignisse verwenden, z als Machen Sie einen Verifizierungsdekorateur. Welche Handler überprüft werden müssen, dekorieren Sie sie einfach mit diesem Dekorateur.
BusManager.Instance.Subscribe( ValidatorDecorator<CreateUserEvent>( UserEventHandler(), BusManager.Instance.Subscribe( LoggerDecorator<CreateUserEvent>( CreateUserEvent { UserName = });
Der Dekorateur verlangt, dass Sie ein zu dekorierendes Objekt und einen Dekorateur übertragen, und das war's.
/// <summary>/// 验证装饰器/// </summary>/// <typeparam name="TEvent"></typeparam> [Serializable]public class ValidatorDecorator<TEvent> : IBusHandler<TEvent>where TEvent : IBusData {/// <summary>/// 要被装饰的处理程序/// </summary>private readonly IBusHandler<TEvent> _inner;/// <summary>/// 校验装饰器集合/// </summary>private readonly IValidator<TEvent>[] _validators;/// <summary>/// 初始化/// </summary>/// <param name="inner">要被装饰的处理程序</param>/// <param name="validators">装饰器</param>public ValidatorDecorator(IBusHandler<TEvent> inner, params IValidator<TEvent>[] validators) { _inner = inner; _validators = validators; }public void Handle(TEvent evt) {var failures = _validators .Select(v => v.Validate(evt)) .SelectMany(result => result.Errors) .Where(error => error != null) .ToList();if (failures.Any()) {throw new ValidationException("实体校验失败", failures); } _inner.Handle(evt); } }
Das Erlernen und Verstehen einer Art von Wissen erfordert eine gewisse theoretische Grundlage. Sie können weitere Bücher wie Design Module, Introduction to Algorithms, .netCLR und so weiter lesen!
Danke fürs Lesen!
Das obige ist der detaillierte Inhalt vonEF-Architektur – tatsächliche Verwendung von FluentValidation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!