gpt4 book ai didi

c# - Autofac 属性注入(inject) System.ComponentModel.DataAnnotations ValidationAttribute

转载 作者:行者123 更新时间:2023-11-30 15:02:26 25 4
gpt4 key购买 nike

我无法对自定义数据注释验证属性执行属性注入(inject)

 public class CustomValidationAttribute : ValidationAttribute 
{
public ILogger Logger { get; set; }

public CustomValidationAttribute(string keyPointer)
{ }

public override bool IsValid(object value)
{
// Implementation here
return true;
}
}

现在,在我的 MVC Application_Start 方法上,我有以下 Autofac 配置:

        // Autofac Ioc Container
var builder = new ContainerBuilder();
builder.RegisterType<Logger>().As<ILogger>().InstancePerHttpRequest();
builder.RegisterType<CustomValidationAttribute>()
.OnActivating(e =>
{
e.Instance.Logger = e.Context.Resolve<ILogger>();
});
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

我也试过 Autowiring 功能:

builder.RegisterType<CustomValidationAttribute>().PropertiesAutowired();

我猜测数据注释上的属性属性在编译时解析并且不受运行时注入(inject)的影响。此方法适用于 MVC 过滤器属性,但不适用于数据注释属性。

对于使这项工作可行的替代方法,我们非常感谢任何帮助。

最佳答案

作为引用,我们遇到了一个 ValidationAttribute 问题,它需要使用 Repository 做一些数据库工作,而 Repository 又使用 Entity Framework DbContext。

我们的问题是 DbContext 被属性缓存了。这导致其中包含的数据过时,从而影响了验证结果!

我们通过在 IsValid 方法内的 Autofac Lifetimescope 声明中执行 Repository resolve 来修复它:

using Autofac;

...

public override bool IsValid(object value)
{
using (var lifetimeScope = MvcApplication.Container.BeginLifetimeScope())
{
var repo = lifetimeScope.Resolve<IMyRepo>();

// Do your validation checks which require the repo here

} // The repo will be released / disposed here
}

只是在此处添加我的解决方案,因为我没有在其他任何地方找到针对此问题的解决方案 - 也许很明显没有其他人像我一样愚蠢:)

关于c# - Autofac 属性注入(inject) System.ComponentModel.DataAnnotations ValidationAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12667326/

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