gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:25:08 25 4
gpt4 key购买 nike

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

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

请注意,根据 Inject into asp.net web api model with autofac,我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com