【发布时间】:2019-09-30 06:59:24
【问题描述】:
我想在 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);
}
}
在 ClientContext 中的 ValidateEntity 方法内
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 方法中遇到编译器错误 - 在以下行:
IEntityValidator<T> validatorObj = (T)ValidatorLocator.GetValidator(entityName, this);
错误提示:使用泛型类型 'ValidatorLocator' 需要 1 个类型参数
返回我的泛型类型的具体实例的正确方法是什么?
【问题讨论】:
-
要修复该错误,您需要执行
ValidatorLocator<T>.GetValidator(...)。但是,您的代码无论如何都不会像这样工作。 -
什么意思?你能指出这里有什么问题吗?
-
那么在
ValidateEntity方法中,T是什么? -
这将是一个不同的实体类型,例如,在上面的 BranchValidator 中,T 将是一个 Branch 对象,在 UserValidator 中,它将是一个 User 对象 - 两者都是 EF 实体
-
是的,但是您的代码使用的是
T而不是其中一种类型,您不能这样做。
标签: c# generics service-locator