我需要一些帮助 - 我正在尝试在需要进行数据库调用的 ASP.NET MVC Web 项目中使用自定义验证属性。
我让 windsor 成功地为 Controller 工作,并且 IRepository 接口(interface)正常注入(inject)。当我需要将存储库注入(inject)属性类时,问题就出现了。
属性类有如下代码:
public class ValidateUniqueUrlNodeAttribute : AbstractValidationAttribute
{
private readonly string message;
private readonly IArticleRepository articleRepository;
public ValidateUniqueUrlNodeAttribute(string message)
{
this.message = message;
}
public ValidateUniqueUrlNodeAttribute(string message, IArticleRepository articleRepository):this(message)
{
this.articleRepository = articleRepository;
}
public override IValidator Build()
{
var validator = new UniqueUrlNodeValidator(articleRepository) { ErrorMessage = message };
ConfigureValidatorMessage(validator);
return validator;
}
我的问题是我似乎无法让 Windsor 拦截要传入 IArticleRepository 的属性的构造
我的global.asax文件中的当前代码如下:
container = new WindsorContainer();
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(Container));
container
.RegisterControllers(Assembly.GetExecutingAssembly())
.AddComponent<IArticleRepository, ArticleRepository>()
.AddComponent<ValidateUniqueUrlNodeAttribute>();
如有任何帮助,我们将不胜感激。
最佳答案
据我所知,没有依赖注入(inject)容器可以直接管理一个属性,因为它是由运行时实例化的,没有办法拦截它。
但是,他们可以作弊:
- 使用容器的静态网关(example),或者
- 使用“BuildUp”功能注入(inject)在已构建对象中找到的任何依赖项。这叫做 BuildUp in Unity或 InjectProperties in Autofac .
Windsor 不支持 #2(ref1,ref2),因此您可以:
- 尝试其中一种让 Windsor 支持 #2(hack1,hack2)的技巧
- 使用 static gateway
- 实现您自己的 IValidatorBuilder并让它使用 Windsor 创建验证器。我确定这是在某个地方实现的,但我现在找不到它...
关于c# - 使用 ASP MVC 和 CaSTLe Windsor 将数据库注入(inject)验证属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/986019/