C# 管理/隐藏特定的程序集依赖项

C# 管理/隐藏特定的程序集依赖项,c#,castle-windsor,C#,Castle Windsor,我一直在重构一个现有的代码库,我一直在研究如何在我的所有项目中隐藏/避免引用外部实用程序。具体来说,我使用castle字典适配器的模式来获取配置依赖项: [AttributeUsage(AttributeTargets.Interface, AllowMultiple = false)] public class AppSettingsFromConfigAttribute : Attribute, IDictionaryBehavior, IDictionaryPropertyGetter,

我一直在重构一个现有的代码库,我一直在研究如何在我的所有项目中隐藏/避免引用外部实用程序。具体来说,我使用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:homeditory和gpg:KeyDirectory

我的问题是,如果AppSettingsFromConfigAttribute是在我的“实用程序”dll中定义的,那么我的所有项目(使用此功能)都需要引用Utlity.dll和Castle.Core来编译-我只是不喜欢,它是对Castle.Core的显式引用,最终会覆盖我的代码库。。。。对于所有项目都不关心的接口,只有castle引导程序需要它们

简言之,类实现了一堆除了1(外部)guy之外没有人关心的外部接口,但是RESTN客户最终需要外部引用来编译,我就是不喜欢这种行为


那么我该如何避免呢?还是我遗漏了一些琐碎的东西?

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


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

从答案中可以看出,您无法做到这一点,尤其是对于属性,它将始终是两个依赖项(最多可以合并到一个DLL中)。因此,我将结构更改为使用:

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

作为一个简单的标记。查看Windsor源代码,在创建字典适配器时,所有实现的接口都在内部用于向类型添加PropertyDescriptor。Windsor是Windsor,它提供了一个重载来外部指定PropertyDescriptor,因此我现在在运行时使用vanilla属性在bootstrapper中自己创建它,bootstrapper是一个需要Castle的地方。

避免引用层次结构中深层次的外部依赖关系的最佳方法是尽可能远地引用它,并将结果传递给用户。这可能会导致您使用更复杂的数据对象作为参数,但最终会产生更干净、更可测试、依赖性更少的代码。@Magus-您能解释一下在我的上下文中这意味着什么吗?我在整个项目中都需要一个marker属性,由它实现的接口只在一个地方使用,即外部框架的主引导。我的问题是,这些导致我在任何地方都添加了一个固定的外部依赖项,只是为了编译。所以,我重复一下,在引导程序中,您得到了值。然后向下传递该值,而不是使用属性,因为该属性将导致该依赖关系。如果只是将值作为参数传递给方法,则不会创建任何依赖项。请避免使用属性,这很公平。但我无法控制Castle的字典适配器——它在内部使用该属性/接口。因此,组织方面没有简单的答案,那么,我将不得不挖掘城堡适配器。谢谢。Castle字典适配器需要这些接口才能工作。所以不能移除它们。动态使用Castle.Core是什么意思?动态加载以使用功能?我所需要的只是共享接口定义……但是,为了让属性类的用户使用该类,接口定义是必需的。它们是其定义的一部分,不能忽视。这些接口与属性本身的名称一样,都是属性定义的一部分。是的,我知道它是必要元数据的一部分,需要加载才能完成类定义,但它不符合我的目标,即切断或管理外部依赖关系,我不知道如何围绕属性编写适配器/外观,我也无法控制Castle对这些接口的使用。下面是另一种思考方法。如果您的属性类实现了.NET接口怎么办?该属性的用户将依赖于包含接口定义的程序集。这与第三方依赖性无关。