C# dotnet应用程序中的层应该是什么?

C# dotnet应用程序中的层应该是什么?,c#,.net,asp.net,architecture,oop,C#,.net,Asp.net,Architecture,Oop,我在dotnet中使用分层架构(我主要从事web项目)。我不知道应该使用什么图层 我有一个小想法,应该有以下几层 用户界面 客户类型(自定义实体) 业务逻辑层 数据访问层 我的目标是确保工作质量和代码的最大可重用性 有人建议在其中添加通用类型层。请指导我应该是什么?在每一层中应该包含哪些部分?对web应用程序进行分层有点棘手。很多操作都是通过业务层进行的,因此您往往会觉得它非常无用 分层的主要目的之一是保持用户界面与数据存储隔离。理论上,您应该能够更改数据存储解决方案,而无需对用户界面进行任何更

我在dotnet中使用分层架构(我主要从事web项目)。我不知道应该使用什么图层

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

  • 用户界面
  • 客户类型(自定义实体)
  • 业务逻辑层
  • 数据访问层
  • 我的目标是确保工作质量和代码的最大可重用性


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

    对web应用程序进行分层有点棘手。很多操作都是通过业务层进行的,因此您往往会觉得它非常无用

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

    通常使用三层:

  • 用户界面
  • 业务逻辑
  • 数据存取

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

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

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

    通常情况下,避免在整个代码中使用硬编码依赖项。设计(单元)可测试性是一个很好的起点


    如果你没有很好的即时答案,那么答案可能不是很重要(即不要过度设计,YAGTNI)。

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

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

    如果您使用的是NHibernate,我强烈建议使用存储库模式和一些依赖注入

    如果您使用的是LINQtoSQL,那么应该使用活动数据记录模式。在这种情况下,您可以使用依赖项注入,也可以不使用依赖项注入

    对于实体框架,可以使用工作单元模式

    通常我会这样安排我的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();
            }
        }
    }
    

    我的代码是这样排列的:

    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
    的单独项目中。然后将其引用添加到相应的程序集

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

    您还可以为您的业务实体使用一个简单的框架,如本文中使用的框架

    最后在Winforms UI层中使用MVC模式。你可以举个例子


    我没有为ASP.NET MVC提供任何链接,因为网络中有很多链接。

    是的,我没有意识到。请重播,我也会复习我之前的问题并做标记。好的,Guffa,你是说总共4层吗?我的层次感好吗?或者可以改进。业务逻辑、验证应该放在哪里?层应该有库曼类型吗?@haansi:不,只有三层。将自定义或通用类型作为一个层实际上意味着您可以将两个业务层堆叠在一起,或者彼此堆叠在一起。在用户界面中进行一些验证是很常见的,但最终的验证是在业务层进行的。Guffa plz explain您的意思是两个业务层(自定义类型和通用类型)应该是还是不应该是?@haansi:如果您将自定义实体定义为一个层,这意味着用户界面只与自定义实体通信,而且永远不要直接和业务层打交道。@downvoter:为什么是downvote?如果你不说出你不喜欢的东西,那就不能改善答案。你能不能解释一下,不要设计你认为你可能需要的东西。你可能猜错了,浪费了时间。谢谢你的声音,请指导,以及哪里应该验证和功能,如hashpassword,getIP和发送电子邮件等?在何处以及如何查看DDD Evans和Fowler的模式?我可以说,您最好将验证逻辑保存在一个地方域模型中(当然,如果您的项目中有验证逻辑的话)。ASP.NET MVC等框架支持这种体系结构。DDD是领域驱动的设计,关于它的最好的书是Eric Evans写的。这有点理论性,但你也可以阅读“应用领域驱动的设计和模式:C#和.NET中的示例”,其中C#中的示例较多,但理论较少。这是Fowler关于企业模式的畅销书感谢JMSA,我使用DAAB和存储过程进行数据库通信。Plz指南。无论您使用哪种技术,您都可以在解决方案中使用相同的安排。只要在MySolution.Service层中插入持久性代码,就可以了!请参阅此示例并插入代码: