我有以下自定义属性;它是标记需要显式注册的接口,而不是根据 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 没有正确选择自定义属性。
任何帮助,将不胜感激