Kim O Ответов: 1

Где разместить класс валидатора fluentvalidation в двухпроектном решении


У меня есть веб-проект и проект библиотеки классов в одном решении. Проект библиотеки классов содержит модели для всех неидентичных данных. Я создал класс валидатора для проверки уникальности таблицы (категории). Когда я помещаю уникальный атрибут в модель, я получаю "тип или имя пространства имен 'CategoryValidator' не может быть найден...".

Вот класс CategoryValidator

namespace Spicy.Entities.Validators
{
    public class CategoryValidator : AbstractValidator<Category>
    {
        public CategoryValidator()
        {
            RuleFor(x => x.Name).NotNull().WithMessage("Category Name is required.").Must(UniqueName).WithMessage("This category name already exists.");
        }

        private bool UniqueName(Category category, string name)
        {
            using (RecipeContext db = new RecipeContext())
            {
                var dbCategory = db.Categories
                                .Where(x => x.Name.ToLower() == name.ToLower())
                                .SingleOrDefault();

                if (dbCategory == null)
                    return true;

                return dbCategory.ID == category.ID;
            }
        }
    }
}



Вот эта категория модель

using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Spicy.Entities
{
    [Validator(typeof(CategoryValidator))]
    public class Category
    {
        public int ID { get; set; }

        [StringLength(20, ErrorMessage = "Category cannot be longer than 20 characters")]
        [Required]

        public string Name { get; set; }

        [Required]
        [DisplayName("User Name")]
        [StringLength(20, ErrorMessage = "User Name cannot be longer than 20 characters")]
        public string UserName { get; set; }

        public virtual ICollection<Recipe> Recipes { get; set; }
    }


Вот вам и глобальный.код эйсакс

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        FluentValidationModelValidatorProvider.Configure();
    }
}



Где я должен поместить класс валидатора и как мне обойти проблемы, с которыми я сталкиваюсь?

помощь.

Что я уже пробовал:

Когда я помещаю класс validator в проект библиотеки классов, он не может получить доступ к контексту (RecipeContext) из веб-проекта. Если я попытаюсь поместить класс validator в веб-приложение, то получу сообщение об ошибке " тип или имя пространства имен 'CategoryValidator' не может быть найден...". я также попытался установить пакет Fluent Validation в обоих проектах.

1 Ответов

Рейтинг:
1

F-ES Sitecore

Веб-проекту необходима ссылка на проект библиотеки классов. Как только это будет сделано посмотрите на свой код;

[Validator(typeof(CategoryValidator))]


Вы просите его использовать тип под названием CategoryValidator, но это имя класса, а не тип, на самом деле это тип

Spicy.Entities.Validators.CategoryValidator


Тип-это пространство имен и имя класса. Таким образом, вы можете изменить свой код на

[Validator(typeof(Spicy.Entities.Validators.CategoryValidator))]


Или оставьте эту строку как есть и добавьте следующий оператор using в верхнюю часть файла класса

using Spicy.Entities.Validators;


Если вы щелкните правой кнопкой мыши на тексте CategoryValidator (он должен иметь волнистую линию под ним), то в контекстном меню появится раздел "Рефактор", который выполнит любое из этих действий за вас.


Kim O

Спасибо. Я внес изменения, которые вы предложили. Для ясности: папка Validators и CategoryValidator.cs находятся в проекте Entities. У меня уже есть ссылка на проект в веб-проекте, ссылающемся на проект entities. Я добавил оператор using. У меня все еще есть проблема, что все ссылки в классе CategoryValidator на RecipeContext ошибка заключается в том, что "тип или имя пространства имен 'RecipeContext' не могут быть найдены...