管理/隐藏特定的程序集依赖性

时间:2014-02-03 18:20:49

标签: c# castle-windsor

我一直在努力重构现有的代码库,并坚持如何隐藏/避免在我的所有项目中引用外部实用程序。具体来说,我正在使用使用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个客户最终需要外部引用来编译,我只是不喜欢这种行为。

那我该如何避免呢?还是我错过了一些微不足道的东西?

2 个答案:

答案 0 :(得分:0)

这是不可能的,因为IDictionaryBehaviorAppSettingsFromConfigAttribute定义的一部分。如果您希望该属性的使用者不依赖于Castle.Core,那么您需要从类定义中删除它。

然后,您可以在属性中动态使用Castle.Core

答案 1 :(得分:0)

从答案中可以看出,你无法做到这一点,特别是对于属性,它总是两个依赖关系(最多可以进入一个DLL)。所以我改变了使用的结构:

[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false)]
public class AppSettingsFromConfigAttribute : Attribute {}

作为一个简单的标记。看一下Windsor源,实现的所有接口都在内部用于在制作字典适配器时将PropertyDescriptor添加到该类型。 Windsor是windsor提供了一个重载来从外部指定一个PropertyDescriptor,所以我现在在运行时使用vanilla属性在bootstrapper中创建它 - 一个需要Castle的地方。