我正在使用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。显然,它们会影响语言编译器-但这又是为了人类的利益,因此我们可以按层次组织类型,而不必在每一步都指定该层次。

10-02 16:20
查看更多