Пользовательский атрибут не фильтруется надлежащим образом при регистрации компонентов по соглашению

У меня есть следующий пользовательский атрибут; он должен обозначать интерфейсы, которые нуждаются в явной регистрации, а не в зависимости от регистрации по соглашению в 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 неправильно подбирает пользовательский атрибут.

Любая помощь будет оценена

1
nl ja de

1 ответы

Атрибуты на интерфейсах не унаследованы от класса, реализующего интерфейс. Вам нужно объявить атрибут (снова) в классе, чтобы он работал так, как вы хотите.

2
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot