我一直在努力重构现有的代码库,并坚持如何隐藏/避免在我的所有项目中引用外部实用程序。具体来说,我正在使用使用castle的字典适配器的模式来获取配置依赖性:
[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false)]
public class AppSettingsFromConfigAttribute : Attribute, IDictionaryBehavior, IDictionaryPropertyGetter, IPropertyDescriptorInitializer, IDictionaryKeyBuilder
{
....
}
其中所有指定的接口都来自Castle.Core。虽然我的所有项目都使用了这个属性,但是这样:
[AppSettingsFromConfig("gpg:")]
public interface IGPGConfiguration
{
string HomeDirectory { get; set; }
string KeyDirectory { get; set; }
}
名义上给我gpg:HomeDirectory和gpg:来自配置文件的KeyDirectory。
我的问题是如果我的“Utility”dll中定义了AppSettingsFromConfigAttribute,我的所有项目(使用此功能)都需要引用两个 Utlity.dll和Castle.Core进行编译 - 我只是不喜欢,它是对Castle.Core的明确引用,最终会遍及我的代码库....对于没有项目关心的接口,只有城堡引导程序需要它们。
简而言之 - 实现了一堆外部接口,除了1(外部)人之外没人关心,但其余N个客户最终需要外部引用来编译,我只是不喜欢这种行为。
那我该如何避免呢?还是我错过了一些微不足道的东西?
答案 0 :(得分:0)
这是不可能的,因为IDictionaryBehavior
等AppSettingsFromConfigAttribute
定义的一部分。如果您希望该属性的使用者不依赖于Castle.Core,那么您需要从类定义中删除它。
然后,您可以在属性中动态使用Castle.Core
。
答案 1 :(得分:0)
从答案中可以看出,你无法做到这一点,特别是对于属性,它总是两个依赖关系(最多可以进入一个DLL)。所以我改变了使用的结构:
[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false)]
public class AppSettingsFromConfigAttribute : Attribute {}
作为一个简单的标记。看一下Windsor源,实现的所有接口都在内部用于在制作字典适配器时将PropertyDescriptor添加到该类型。 Windsor是windsor提供了一个重载来从外部指定一个PropertyDescriptor,所以我现在在运行时使用vanilla属性在bootstrapper中创建它 - 一个需要Castle的地方。