Я хочу реализовать общий механизм проверки сущности поверх платформы проверки EF.Я создал общий интерфейс с единственным методом Validate()
, который будет реализован различными валидаторами сущностей.Затем я использую шаблон локатора службы для создания экземпляра соответствующей конкретной реализации валидатора внутри переопределения метода EF ValidateEntity
.Вот моя реализация:
Интерфейс валидатора
public interface IEntityValidator<T>
{
DbEntityValidationResult ValidateEntity(T entity);
}
Реализация валидатора
public class BranchValidator<Branch>: IEntityValidator<Branch>
{
ClientContext clientContext;
public BranchValidator(ClientContext clientContext)
{
this.clientContext = clientContext;
}
public DbEntityValidationResult ValidateEntity(Branch entity)
{
throw new NotImplementedException();
}
}
Сервисный локатор (локатор проверки)
public static class ValidatorLocator<T>
{
public static IEntityValidator<T> validatorObject;
public static IEntityValidator<T> GetValidator(string entityType, ClientContext clientContext)
{
switch (entityType)
{
case "User":
validatorObject = new UserValidator<T>(clientContext);
break;
case "Branch":
validatorObject = new BranchValidator<T>(clientContext);
break;
default:
validatorObject = null;
break;
}
return validatorObject;
}
public static void Validate(T obj)
{
validatorObject.ValidateEntity(obj);
}
}
внутри метода ValidateEntity в ClientContext
public partial class ClientContext : DbContext
{
public ClientContext(string connectionString)
: base(connectionString)
{
}
protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
var entityName = entityEntry.Entity.GetType().FullName;
IEntityValidator<T> validatorObj = (T)ValidatorLocator.GetValidator(entityName, this);
return base.ValidateEntity(entityEntry, items);
}
}
Я получаю ошибку компилятора в методе ValidateEntity
- onследующая строка:
IEntityValidator<T> validatorObj = (T)ValidatorLocator.GetValidator(entityName, this);
Ошибка говорит: Использование универсального типа 'ValidatorLocator' требует аргументов 1 типа
Как правильно вернуть конкретный экземплярмоего родового типа?