1

我有以下自定义属性;它是标记需要显式注册的接口,而不是根据 Castle Windsor 中的约定进行注册:

using System;

[AttributeUsage(
        AttributeTargets.Interface | AttributeTargets.Class, 
        Inherited = true)]
public class ExplicitDependencyRegistrationRequiredAttribute : Attribute
{
}

然后将其应用于接口,如下所示:

using Dependencies.Attributes;

[ExplicitDependencyRegistrationRequired]
public interface IRandomNumberGenerator
{
    int GetRandomNumber(int max);
}

下面有一个简单的具体实现:

using System;

public class RandomNumberGenerator : IRandomNumberGenerator
{
    private readonly Random random = new Random();

    public int GetRandomNumber(int max)
    {
        return random.Next(max);
    }
}

这个想法是,当在 Castle Windsor 中按照惯例注册组件时,我们不必担心重复注册或添加异常;相反,我们只需要确保接口标记有这个属性。然后过滤它的代码如下:

Type exclusionType = typeof(ExplicitDependencyRegistrationRequiredAttribute);

BasedOnDescriptor selectedTypes =
    Classes
      .FromAssembly(assembly)
      .Where(t => !Attribute.IsDefined(t, exclusionType, true))
      .WithServiceAllInterfaces();

问题是Attribute.IsDefined过滤器似乎不起作用,从具有属性的接口继承的组件仍在注册中。

当我将属性显式添加到RandomNumberGenerator类时,过滤器起作用;但是它似乎没有从界面继承,或者Castle Windsor 没有正确选择自定义属性。

任何帮助,将不胜感激

4

1 回答 1

2

接口上的属性不会被实现接口的类继承。您需要(再次)在类上声明属性,以使其按您想要的方式工作。

于 2012-12-30T15:20:22.857 回答