Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#项目之间添加引用的经验法则?_C#_Visual Studio - Fatal编程技术网

在C#项目之间添加引用的经验法则?

在C#项目之间添加引用的经验法则?,c#,visual-studio,C#,Visual Studio,我有一个关于解决方案中项目之间的引用的问题。我以前的大多数应用程序在解决方案中只有一两个项目,但这次我想进一步划分应用程序 我现在正在VisualStudio2008中启动一个新的解决方案,并创建了几个底层项目来划分应用程序的各个部分 但目前我只是一时兴起创建不同的项目,并在需要时在它们之间创建引用。有时我会遇到两个项目需要相互引用的情况,但这是不允许的,因为这会导致循环依赖 当我创建不同的项目并将它们链接在一起时,有什么规则/提示/模式我应该记住吗 我应该从里面开始,然后出去吗?让“核心”项目

我有一个关于解决方案中项目之间的引用的问题。我以前的大多数应用程序在解决方案中只有一两个项目,但这次我想进一步划分应用程序

我现在正在VisualStudio2008中启动一个新的解决方案,并创建了几个底层项目来划分应用程序的各个部分

但目前我只是一时兴起创建不同的项目,并在需要时在它们之间创建引用。有时我会遇到两个项目需要相互引用的情况,但这是不允许的,因为这会导致循环依赖

当我创建不同的项目并将它们链接在一起时,有什么规则/提示/模式我应该记住吗


我应该从里面开始,然后出去吗?让“核心”项目引用所有外部项目,或者可能从外部和内部独立项目都引用“核心”项目?或者第三种选择,我在两个项目中有业务,它们都引用了第三个项目?

确实,您不能有循环引用,但老实说,如果您在所有项目之间都有依赖关系,那么将解决方案拆分为小项目会有什么好处

通常在我打开VisualStudio之前,我会拿一张纸把我的问题分成逻辑功能区。您可以在顶部绘制实用程序集,在底部绘制所有GUI、web服务和其他终端项目。Utilities项目不会引用任何其他项目,底部的项目也不会被任何东西引用。然后,您会想到这些功能的共同点,例如,所有GUI都可以与公共用户控件和对话框共享一个公共UI项目,该UI项目将引用“对象模型”项目等。底部的项目只能引用它们上面的项目

通常,当您需要一个循环引用时,您可以通过在较低级别的程序集中定义一个接口并在较高级别提供实现来很好地绕过它


在不知道你到底在做什么的情况下,我恐怕这是我能给你的唯一建议。

这有点过时,但要帮助你决定如何拆分项目,你可以在维基百科中查找“耦合”和“聚合”

此外,虽然我们有时认为这些决定是“风格”而不是“实质”,但我们应该记住,汇编边界对编译器和运行时都有意义。有几个例子

  • C#编译器理解一个名为“internal”的关键字。为了做出关于分解成不同项目的最佳决策,您应该真正理解这一点的威力

  • 运行时中的JIT编译器永远不会内联跨越程序集边界的函数调用,这会影响性能。(原因与代码访问安全有关)


  • 还有更多的例子,所以这个决定确实起到了作用。

    我将以Winforms应用程序为例。我开始进入的模式是这样的。解决方案称为示例

    示例。实体-此项目将包含我的业务对象和类的相关继承权

    Example.Dal-我将所有业务逻辑和数据访问逻辑放在这个项目(名称空间)中。这是加载业务对象然后将它们传递到另一层的代码

    Example.Gui-我将所有Winforms和Gui实用程序代码以及我的“main”启动条目方法放在这里。您也可以选择将此项目称为示例。我仍然喜欢使用namespace Example.Gui进行代码分离

    示例.Test-您可以将所有测试代码放在此项目中

    如果代码属于某个业务对象或业务对象集合,我会尝试将其驱动到实体中

    Gui将引用实体和Dal(数据访问层)。 根据您编写Dal的方式,Dal可能会引用您的实体。 测试应该引用实体、Dal,可能还有Gui

    这些实体是它自己的程序集dll,因此您可以在其他项目中使用它。或者从.NETSOAP服务返回它们


    GUI层应将DAL的内部视为黑盒。您的主应用程序不应该关心如何加载或持久化业务对象。但是你应该使用你的测试项目来彻底测试你的DAL。

    谢谢,这是我需要的提示。现在我还可以在一张纸上画出引用,这样更容易确定谁应该引用谁。我听说,基本级别项目组件(如DAL和POCO实体)的Nuget打包是一个好主意,因为您可以在多个解决方案中安装Nuget包。你也听说过吗?如果是,您能解释一下在这种情况下我如何使用Nuget打包吗?将解决方案拆分为更小的项目的好处是代码可重用。我们可以将更多的可重用代码分离到不同的项目中,并让我们的LOB项目引用它。。。如果您观看一些.NET Rocks视频播客,Carl的一些客人也会使用非常好的解决方案布局。