【问题标题】:What should layers in dotnet application?dotnet 应用程序中应该分层什么?
【发布时间】:2011-02-09 13:55:38
【问题描述】:

我在 dotnet 中使用分层架构(我主要从事 Web 项目)。我很困惑我应该使用哪些层?

我有个小想法,应该有以下几层。

  1. 用户界面
  2. 客户类型(自定义实体)
  3. 业务逻辑层
  4. 数据访问层

我的目的是确保工作质量和代码的最大可重用性。

有人建议在其中添加通用类型层。请指导我应该是什么层?每一层应该去哪一部分?

【问题讨论】:

  • 是的,我没意识到。请重播,我也会复习我以前的问题并标记它们。

标签: c# .net asp.net architecture oop


【解决方案1】:

对 Web 应用程序进行分层有点棘手。很多操作只是通过业务层,所以你往往会觉得它很没用。

分层的主要目的之一是使用户界面与数据存储隔离。理论上,您应该能够更改数据存储解决方案,而无需对用户界面进行任何更改。以我的经验,这种情况很少发生,但仅仅拥有抽象会给您带来其他优势,例如防止数据存储中的细节出现在用户界面设计中。

通常使用三层:

  1. 用户界面
  2. 业务逻辑
  3. 数据访问

数据类/实体不是它们自己的层,而是层之间接口的一部分。通常,它们由业务层公开以供用户界面使用。

【讨论】:

  • 好的,Guffa 是指总共 4 层吗?我的层次感好吗?或者可以改进。业务逻辑和验证应该放在哪里?应该有 cuomman 类型作为层吗?
  • @haansi:不,只有三层。将自定义或通用类型作为一个层实际上意味着您将两个业务层堆叠或堆叠在一起。在用户界面中进行一些验证是很常见的,但最终验证是在业务层中进行的。
  • Guffa plz 解释一下你的意思是两个业务层(自定义类型和通用类型)应该还是不应该?
  • @haansi:如果您将自定义实体定义为一个层,这意味着用户界面只与自定义实体通信,而不会直接与业务层通信。
  • @downvoter:为什么要投反对票?如果你不说你不喜欢什么,那是无法改善答案的。
【解决方案2】:

这取决于您使用的数据访问技术。

如果您使用 NHibernate,我强烈推荐 Repository-pattern 以及一些依赖注入。

如果您使用的是 Linq-to-sql,则应该使用 Active Data Record-pattern。在这种情况下,你可能会也可能不会使用依赖注入。

在实体框架的情况下,可以使用工作单元模式。

通常我安排我的 VS2005/2008 - 解决方案如下:

而且,我这样安排我的代码:

namespace MySolution.Entity
{
    public interface IMyInterface
    {        
        int Save(MyClass obj);
    }
}

namespace MySolution.Entity
{
    public class MyClass
    {
        IMyInterface _myDa;

        public MyClass(IMyInterface myDa)
        {
            _myDa = myDa;
        }

        private string _message;
        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        public int Save()
        {
            return _myDa.Save(this);
        }
    }
}

using MySolution.Entity;
namespace MySolution.Service
{
    public class MyClassService : IMyInterface
    {
        public int Save(MyClass obj)
        {
            Console.WriteLine(obj.Message);

            return 1;
        }
    }
}

using MySolution.Entity;
using MySolution.Service;
namespace MySolution.UI
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myobj = new MyClass(new MyClassService());
            myobj.Message = "Goodbye Circular Dependency!";
            myobj.Save();

            Console.ReadLine();
        }
    }
}

您可以将IMyInterface.cs 放在一个名为MySolution.Contracs 的单独项目中。并且,然后将它的引用添加到相应的程序集。

请注意,这称为分层设计,而不是分层设计。

您还可以为您的业务实体使用一个简单的框架,例如此 example 中使用的框架。

最后在您的 Winforms UI 层中使用 MVC 模式。您可以获取示例here

而且我没有提供任何 ASP.NET MVC 的链接,因为网上有很多。

【讨论】:

  • 感谢 JMSA,我正在使用带有存储过程的 DAAB 进行数据库通信。请指导一下。
  • 无论您使用哪种技术,您都可以在解决方案中使用相同的排列方式。只需将持久性代码插入 MySolution.Service - 层即可!看这个例子并插入代码:codersource.net/asp-net/application-blocks/…
【解决方案3】:

这完全取决于需求,尤其是非功能性需求。

单用户交互式应用程序的答案可能与需要扩展以支持数千名用户的 Web 应用程序大不相同。

一般是 KISS,但要避免在整个代码中进行硬编码依赖。设计(单元)可测试性是一个很好的起点。

如果你没有好的直接答案,也许答案不是很重要(即不要过度设计和 YAGTNI)。

【讨论】:

  • 你能解释一下工程师 YAGTNI 吗?
  • @haansi: YAGTNI = “你不需要它”:即不要为你认为你可能需要的东西设计。您可能会猜错并浪费时间。
【解决方案4】:

我建议您首先查看 DDD (Evans) 和 Fowler 的应用程序模式。这将向您展示大局。您在项目中拥有的层数可能会有所不同:可以是 3 层或 5 层。这取决于项目的复杂性、您的经验等。所以没有明确的答案应该是多少层。层的主要目的是职责分离:表示层负责 UI 和 UI 逻辑,领域模型层负责您的业务逻辑,数据访问负责对您的对象进行 CRUD 操作等等。

【讨论】:

  • 感谢 Voice,请指导验证和功能(如 hashpassword、getIP 和发送电子邮件等)应该在哪里?我可以在哪里以及如何查看 DDD Evans 和 Fowler 的模式?
  • 好吧,我可以说你最好把你的验证逻辑放在一个地方——域模型(当然,如果你的项目中有它的话)。诸如 ASP.NET MVC 之类的框架支持这种架构。 DDD- 是领域驱动设计,最好的书是 Eric Evans 写的。这有点理论,但您也可以阅读“应用领域驱动设计和模式:使用 C# 和 .NET 中的示例”,它在 C# 中有更多示例,但理论较少。 domaindrivendesign.org/books
  • 这是福勒关于企业模式的畅销书amazon.com/Patterns-Enterprise-Application-Architecture-Martin/…
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2018-08-01
  • 2011-10-22
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多