如何使基础设施的代码只有在命名空间中可见?(How do you make infrastructu

2019-09-19 17:02发布

我有调度场算法,我想清楚地融入我们的框架的实现。 目前,我有这一切包装成一个类用一个简单的公共接口。

namespace MathematicalParser {
  public class ExpressionParser {
    public ExpressionParser(string expression, List<string> variables);
    public double GetNumericValue(Dictionary<string,double> variableValues);
  }
}

这个类里面有很多的辅助类,帮助枚举,静态变量等,以不同的名称将函数映射。 所有这些都是私有,这样不用担心图书馆的用户。

为了改善我试图分开的代码,在逻辑上是不相关的到自己的类代码的可维护性的努力,这样的类也不过没有ExpressionParser以外的任何意义,所以我想自己的知名度限制在命名空间MathematicalParser (其仅包含ExpressionParser)。

你如何最好在C#中实现这一点,内部关键字仅适用于组件和私人不能在命名空间中使用。

Answer 1:

我不会做这个(相同的看法乔),但这里是从Lopina的回答得出另一种解决办法: 嵌套类+局部类

PublicClass.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        public int ReturnSomeStuff()
        {
            MyHelperClass1 tmp = new MyHelperClass1();
            MyHelperClass2 tmp2 = new MyHelperClass2();

            return tmp.GetValue1() + tmp2.GetValue2();
        }
    }
}

PrivateClass1.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        private class MyHelperClass1
        {
            public int GetValue1()
            {
                return 5;
            }
        }
    }
}

PrivateClass2.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        private class MyHelperClass2
        {
            public int GetValue2()
            {
                return 10;
            }
        }
    }
}

Program.cs中:

public class Program
{
    private static void Main(string[] args)
    {
        PublicClass tmp = new PublicClass();

        MyHelperClass2 zz;  // Can't access MyHelperClass2 here cause it's private

        Console.WriteLine(tmp.ReturnSomeStuff());
        Console.ReadLine();
    }
}

正如你所看到的,您不同的辅助类不同文件中的物理分离(也许它会帮助你保持你的代码)。 你不能直接访问他们,他们是私有的PublicClass



Answer 2:

您可以选择使用私有嵌套类试过吗?
参加这里看看: 私有内部类在C#中-他们为什么不使用更频繁?



Answer 3:

如果你真的不顾一切地做到这一点(我在原来的问题意见的光),你可以把所有的辅助类到一个单一的组件,使它们的内部,所以他们有效地利用关闭。 然后进行第二组件,你让人们使用的一个,并把“公众”的类和方法,第二安装。 然后使用InternalsVisibleTo让你的“公”装配使用其他“私人”组件的辅助类和方法。

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

这并不意味着你必须要强迫人们使用你的库中不同的装配工作,以包含您的“公”库代码之一。 我想从你的问题你是说,他们是在同一程序,在这种情况下,你必须在“公共”图书馆出来分成不同的装配工作。 如果你没有这样做,那么简单地使内部的方法,并把它们放在同一个议会将做的工作毕竟。

如果你去这两个组装的路线,如果你的同事在同一组装工作,至少有一个在引用可能会阻止他们使用它的另一个装配额外的“一步”。

如果还不够的......我不知道,写一个WCF web服务,通过这项工作*。

*这是讽刺



文章来源: How do you make infrastructure code only visible in namespace?