Heim  >  Artikel  >  Backend-Entwicklung  >  EF-Architektur – tatsächliche Verwendung von FluentValidation

EF-Architektur – tatsächliche Verwendung von FluentValidation

零下一度
零下一度Original
2017-06-24 10:39:581620Durchsuche

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:

  1. wird mit Datenentitäten gemischt, die von Ihnen hinzugefügten Funktionen gehen möglicherweise verloren, wenn die Entität aktualisiert wird.

  2. Wenn es viele VO gibt Sie müssen es dem spezifischen VO hinzufügen, da die Semantik von DO möglicherweise nicht klar ist

  3. und es für die Migration nicht geeignet ist und zu stark mit ModelState gekoppelt ist

  4. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn