我正在使用Depency Injection的项目中工作。注册一组接口和类时,我需要指出这些接口和类所位于的名称空间。
我不喜欢提供字符串常量,主要是因为它损害了可重构性。我不喜欢采用接口/类之一并获得其名称空间。例如:
typeof(FoodStore.Fruits.IApple).Namespace
因为所有这些任意类型的名称徘徊(为什么选择
IApple
而不是IOrange
?)看起来很奇怪,只是为了分散代码的实际位置。根本没有明智的规则来选择哪种类型。我想出了以下解决方案。
在需要引用的每个命名空间中放置一个命名空间锚点类:
namespace FoodStore.Fruits
{
/// <summary>
/// Serves as a type based reference to the namespace this class
/// is located in.
/// </summary>
public sealed class _NamespaceAnchor
{
}
}
现在我可以使用:
typeof(FoodStore.Fruits._NamespaceAnchor).Namespace
每当我重构名称空间时,我都不必担心DI注册。
尽管此解决方案满足了问题的要求,但我仍然不满意,因为现在我到处都是这些丑陋的空类。我不能将它们设置为
internal
,因为-显然-引用跨程序集。我的问题是:有人知道更好的解决方案吗?
最佳答案
不,没有什么比这更好的了-据我所知,名称空间并不是CLR中真正的一流概念。是的,Type
允许您要求一个名称空间-但是名称空间实际上是供人类使用的,而不是VM。
请注意,与Java不同,在名称空间级别没有访问控制。我没有检查,但是我怀疑名称空间没有特定的元数据令牌。
我想不出任何有关名称空间的信息,这些名称空间会在执行时影响CLR。显然,它们会影响语言编译器-但这又是为了人类的利益,因此我们可以按层次组织类型,而不必在每一步都指定该层次。