Asp.net core 访问ValidationAttribute中的IServiceProvider实例

Asp.net core 访问ValidationAttribute中的IServiceProvider实例,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,您好,我正在尝试在asp.net core中创建自定义DataAnnotation属性。以下是我到目前为止的情况: [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public class StoreDupplicateAttribute : ValidationAttribute { pu

您好,我正在尝试在asp.net core中创建自定义DataAnnotation属性。以下是我到目前为止的情况:

   [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class StoreDupplicateAttribute : ValidationAttribute
{
    public StoreDupplicateAttribute(IStoreManager storeManager)
    {

    }

    public override bool IsValid(object value) {

    }
}
在我的代码中需要一个IStoreManager的实例。问题是,如果我这样做,我需要在使用属性时将IStoreManager作为参数传递


是否有任何方法可以访问IServiceProvider的实例,从而在不使用构造函数注入的情况下从中获得我的IStoreManager依赖关系?

我也找不到类似问题的答案,但后来我找到了答案。您应该重写其他虚拟IsValid方法,如下所示:

public class StoreDupplicateAttribute : ValidationAttribute
{
    public StoreDupplicateAttribute()
    {
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        IStoreManager storeManager = validationContext.GetService(typeof(IStoreManager)) as IStoreManager;

        return ValidationResult.Success;
    }
}

我不确定,但我认为您可以使用
[FromServices]
对属性进行注释,直接将其注入,而不是通过构造函数。然而,我怀疑这只适用于控制器(因此我不将其作为答案发布,因为我自己没有时间测试它)。值得一试。。。