如何在自定义验证器中注入一些东西?

时间:2013-10-12 19:17:08

标签: c# ninject repository-pattern wcf-ria-services customvalidator

我正在为一个实体使用CustomValidation,我想在其中注入Repository。验证方法必须是静态的。有没有办法在静态上下文中注入对象而不是服务位置?

这是我的元数据:

[MetadataTypeAttribute(typeof(BillPosition.BillPositionsMetadata))]
[CustomValidation(typeof(BillPositionValidator), "ValidateBillPositionsCount")]
public partial class BillPosition
{
    internal sealed class BillPositionsMetadata
    {
        private BillPositionsMetadata() { }

        public int BillId { get; set; }
    }
}

这是验证码:

public class BillValidator
{
    [Inject]
    public static IRepository Repository { get; set; }

    public static ValidationResult ValidateBillPositionsCount(BillPosition bill, ValidationContext context)
    {
        ValidationResult result = ValidationResult.Success;

        /* Repository wasn't injected and I get null reference exception */
        var billPositions = Repository.BillPositions.Count(position => position.BillId == bill.BillId);
        if (bill.BillPositions.Count == 0 && billPositions == 0)
        {
            result = new ValidationResult("Invalid positions count", new[] { "BillPositions" });
        }

        return result;
    }
}

3 个答案:

答案 0 :(得分:0)

没有任何方法可以注入自定义验证器。可以使用服务定位器或某种形式的反射来访问正在执行验证器的实例上的属性或方法。您可以通过ValidationContext访问此实例。

http://www.jaltiere.com/index.php/2010/05/04/ninject-with-mvc-and-validationattributes/

答案 1 :(得分:0)

您可以调用IoC并解决依赖关系。就像我使用Unity一样。在这些情况下,我会调用Bootstrapper.Unity.Resolve(“NameOfMyDependency”)

答案 2 :(得分:0)

如果您没有从依赖注入容器中解析验证器,您仍然可以使用某种服务定位器直接解析存储库:

public class BillValidator
{
    static BillValidator()
    {
        Repository = ServiceLocator.Current.GetInstance<IRepository>();
    }

    public static IRepository Repository { get; set; }
}

这样您就可以使用new - 关键字

初始化验证程序
var validator = new BillValidator();

你仍然可以在验证器中解决依赖关系。

由于存储库在类型初始化程序中得到解析,因此在应用程序中每种类型只执行一次。验证器的所有实例都将使用相同的存储库。

此代码在使用Unity时有效,但在使用MEF或其他容器时应该是等效的。