使用ASP MVC和Castle Windsor将数据库注入到验证属性中

Dav*_*d E 7 c# asp.net-mvc castle-windsor

我需要一些帮助 - 我试图在需要进行数据库调用的ASP.NET MVC Web项目中使用自定义验证属性.

我有windsor成功地为控制器工作,并正常注入IRepository接口.当我需要将存储库注入属性类时,问题就出现了.

属性类具有以下代码:

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;
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是我似乎无法让Windsor拦截传递给IArticleRepository的属性的构造

我的global.asax文件中的当前代码如下:

container = new WindsorContainer();
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(Container));
   container
     .RegisterControllers(Assembly.GetExecutingAssembly())
     .AddComponent<IArticleRepository, ArticleRepository>()
     .AddComponent<ValidateUniqueUrlNodeAttribute>();
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Mau*_*fer 5

AFAIK没有依赖注入容器可以直接管理属性,因为它是由运行时实例化的,并且没有办法拦截它.

但是,他们可以通过以下方式作弊:

  1. 使用静态网关到容器(示例),或
  2. 使用注入任何依赖关系的"BuildUp"功能可在已构造的对象中找到.这就是所谓的团结堆积InjectProperties在Autofac.

Windsor不支持#2(ref1,ref2),所以你可以:

  1. 尝试其中一个黑客来使Windsor支持#2(hack1,hack2)
  2. 使用静态网关
  3. 实现自己的IValidatorBuilder,并使用Windsor创建验证器.我确定这是在某处实现但我现在找不到它...


归档时间:

查看次数:

7837 次

最近记录:

10 年,2 月 前