C # Создание службы проверки универсального типа - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть структура людей на предприятии, таких как Босс и Сотрудник.

Я только что добавил Validator для каждого типа, чтобы применять правила, прежде чем двигаться вперед с созданием.

public class BossService : IStructMapper<People>
{
    IValidatorService<Boss> _validatorService;

    public BossService(IValidatorService<Boss> validatorService)
    {
        _validatorService = validatorService;
    }

    public List<Boss> Convert(string json)
    {
        var bossSource = JsonConvert.DeserializeObject<List<boss>>(json);

        bossSource.ForEach(x => x.ApplyRules());

        _validatorService.ValidateContent(new BossValidator(), bossSource);
    }
}


public class BossValidatorService : IValidatorService<Boss>
{

    public void ValidateContent(AbstractValidator<Boss> validator, List<Boss> bossContent)
    {
         foreach (var item in bossContent)
            {
                var result = validator.Validate(item);
                if (result.IsValid) continue;
            }
    }
}

public interface IValidatorService<T>
{
    void ValidateContent(AbstractValidator<T> validator, List<T> content);
}


public class BossValidator : AbstractValidator<Boss>
{
    public BossValidator()
    {
         ***rules for boss**
    }
}

, поэтому вмоя программа, которую я вызываю и выполняет свою работу:

var bosses = new BossService(new BossValidatorService()).Convert(datafile)

Для сотрудника я создал отдельный класс EmployeeService и EmployeeValidator:

public class EmployeeService : IStructMapper<People>
{
    IValidatorService<Employee> _validatorService;

    public EmployeeService(IValidatorService<Employee> validatorService)
    {
        _validatorService = validatorService;
    }

    public List<Employee> Convert(string json)
    {
        var employeeSource = JsonConvert.DeserializeObject<List<Employee>>(json);

        employeeSource .ForEach(x => x.ApplyRules());

        _validatorService.ValidateContent(new BossValidator(), bossSource);
    }
}

public class EmployeeValidator : AbstractValidator<Employee>
    {
        public EmployeeValidator()
        {
             ***rules for employee**
        }
    }

Как мне упростить код, чтобы не создаватьBossValidatorService, EmployeeValidatorService, ConsultantValidatorService и т. Д., Поскольку функция ValidateContent будет одинаковой для каждого типа.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы должны передать Тип в Класс и использовать Generics, как и предполагалось.Я не пошел к запуску кода, но вам должно быть понятно, как использовать:

var bosses = new Service<Boss>(new ValidatorService<Boss, BossValidator>()).Convert(datafile)

public class Service<T, TValidator> : IStructMapper<People> where TValidator : new()
    {
        IValidatorService<T> _validatorService;

        public Service(IValidatorService<T> validatorService)
        {
            _validatorService = validatorService;
        }

        public List<T> Convert(string json)
        {
            var Source = JsonConvert.DeserializeObject<List<T>>(json);

            Source.ForEach(x => x.ApplyRules());

            _validatorService.ValidateContent(new TValidator<T>(), Source);
        }
    }


    public class ValidatorService<T> : IValidatorService<T> 
    {

        public void ValidateContent(AbstractValidator<T> validator, List<T> Content)
        {
            foreach (var item in Content)
            {
                var result = validator.Validate(item);
                if (result.IsValid) continue;
            }
        }
    }

    public interface IValidatorService<T>
    {
        void ValidateContent(AbstractValidator<T> validator, List<T> content);
    }


    public class BossValidator : AbstractValidator<Boss>
    {
        public BossValidator()
        {
            ***rules for boss * *
        }
    }



    public class EmployeeValidator : AbstractValidator<Employee>
    {
        public EmployeeValidator()
        {
            ***rules for employee * *
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...