c# - 是否可以注入(inject)到asp.net web api模型类中

标签 c# asp.net-web-api dependency-injection dependencies

我正在 asp.net web api 中的模型类上实现 IValidatableObject。某些对象需要访问数据存储库才能执行完整验证。

如何在调用 IValidatableObject.Validate 之前解决 DAL 依赖关系 - 或者是否有其他方法来解决 Validate 调用中的依赖关系?

请注意,我正在尝试使用 autofac,按照Inject into asp.net web api model with autofac但在我看来,模型不是使用依赖解析器调用的。

最佳答案

您的模型类不应该成为依赖注入(inject)的一部分。他们也不应该负责自己的验证(尽管用验证属性装饰它们 - 这只是元数据 - 就可以了)。

而是定义一个适当的抽象来进行验证。例如,定义这个抽象:

public interface IValidator<T>
{
    ValidationResult Validate(T instance);
}

通过这种方式,您可以拥有零个、一个或多个 IValidator<T> 的实现。特定类型的接口(interface),您可以使用 Autofac 非常有效地注册这一切。

当类型没有验证时,您可以让容器传回默认的 -empty- 实现:

// Implementation of the Null Object pattern
public class EmptyValidator<T> : IValidator<T>
{
    public ValidationResult Validate(T instance)
    {
        return ValidationResult.ValidResult;
    }
}

当一个类型定义了多个验证器时,您可以将它们包装在一个组合中:

// Implementation of the Composite pattern
public class CompositeValidator<T> : IValidator<T>
{
    private readonly IEnumerable<Validator<T>> col;

    public CompositeValidator(IEnumerable<Validator<T>> col)
    {
        this.col = col;
    }

    public ValidationResult Validate(T instance)
    {
        ValidationResult total = ValidationResult.ValidResult;

        foreach (var validator in this.col)
        {
            var result = validator.Validate(instance);
            total = ValidationResult.Append(total, result);
        }

        return total;
    }
}

而不是注入(inject) IValidator<T>直接进入您的 Web API Controller ,创建一个装饰器来包裹您的 IRepository<T>接口(interface)。这样您就可以添加验证行为,而无需更改存储库。这样的实现可能如下所示:

public class ValidationRepositoryDecorator<T>
    : IRepository<T>
{
    private readonly IRepository<T> decorated;
    private readonly IValidator<T> validator;

    public ValidationRepositoryDecorator(
        IRepository<T> decorated,
        IValidator<T> validator)
    {
        this.decorated = decorated;
        this.validator = validator;
    }

    public void Save(T instance)
    {
        var result = this.validator.Validate(instance);

        if (!results.IsValid)
            new ValidationException(result);

        this.decorated.Save(instance);
    }
}

Autofac 允许您为您注册装饰器。

关于c# - 是否可以注入(inject)到asp.net web api模型类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13193756/

相关文章:

java - Guice:我是否必须使用@Inject 来注释对象图的每个类?

javascript - 我的 Angular 应用程序中的依赖注入(inject)在哪里出了问题

c# - 从我的 Ex :CommandColumn? 调用命令时幕后发生了什么

C#和MYSQL数据库在另一台电脑上

c# - Entity Framework 一对多自引用关系

asp.net - SignalR 不再工作 "No assembly found containing an OwinStartupAttribute"

asp.net - Web Api - 如何直接从 OnActionExecuting 过滤器停止 Web 管道

android - 替换正在运行的 roboguice 应用程序中的单例实例

c# - 由于 'missing' 引用,无法构建发布配置

c# - 在将 JS 用于 REST API 的 ASP MVC 应用程序中处理安全性