Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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
Asp.net 如何构造解决方案文件和文件夹以最适合MVP设计模式?_Asp.net_.net_Visual Studio_Mvp - Fatal编程技术网

Asp.net 如何构造解决方案文件和文件夹以最适合MVP设计模式?

Asp.net 如何构造解决方案文件和文件夹以最适合MVP设计模式?,asp.net,.net,visual-studio,mvp,Asp.net,.net,Visual Studio,Mvp,您能否建议以一种与MVP设计模式相匹配的方式构造解决方案项目、文件和Fodler,以表示模式理念 我的意思是,你会如何放置你的演示者、数据访问层、视图等 谢谢下面将是一个很好的开始。如果项目变得更大,您可以拆分得更多: Company.Project.Core -> Controller logic Company.Project.Domain -> Domain models (view models and database models) Company.Project.Int

您能否建议以一种与MVP设计模式相匹配的方式构造解决方案项目、文件和Fodler,以表示模式理念

我的意思是,你会如何放置你的演示者、数据访问层、视图等


谢谢

下面将是一个很好的开始。如果项目变得更大,您可以拆分得更多:

Company.Project.Core -> Controller logic
Company.Project.Domain -> Domain models (view models and database models)
Company.Project.Interface -> Views, presenters

解决方案体系结构通常与您使用的UI体系结构非常独立,尽管如果您计划有多个UI应用程序(大多数项目不这样做),可能会有一些额外的分离

我倾向于从类似以下的模板开始:

  • Acme.Sales
    Acme.Sales.Core
    -内部域/业务逻辑

  • Acme.Sales.Entities
    -用于持久层的数据实体。实体具有与核心(域)模型类似的类结构,但往往具有更薄的逻辑、附加属性,如
    Id
    、双向关系(与域模型中的单向关系相反)和
    虚拟
    成员,以便ORM能够覆盖。此程序集通常还包括用于实体上CRUD操作的抽象存储库

  • Acme.Sales.Entities.Impl
    其中
    Impl
    类似于
    LinqToSql
    NHibernate
    -此名称空间定义了实际持久化
    实体的一个可能实现。这里是抽象存储库的具体实现

  • Acme.Sales.UI
    包含与任何用户界面相关的公共类-可能是MVP GUI,甚至是CLI。与
    实体
    一样,这些实体类似于
    核心
    类,但往往具有特定于表示的逻辑和属性,例如验证和格式化(今天最常见的是通过
    数据注释
    )。请注意,核心库也应该进行验证,但UI验证往往更多地是关于输入的格式化和清理,而不是业务规则。在这里模仿域的类结构是很有诱惑力的,但是如果你坚持为你的UI模型使用平面的DTO风格的类,你会有一个更轻松的时间

  • Acme.Sales.UI.Services
    包含抽象或具体的“服务”类型,用于与UI和域/持久层交互。因此,该项目依赖于
    Acme.Sales
    (域)、
    Acme.Sales.Entities
    (抽象存储库)以及
    Acme.Sales.UI
    ,并处理这些不同层之间的所有映射活动

  • Acme.Sales.UI.Impl
    其中
    Impl
    这里有一些类似于
    Mvp
    Mvc
    Mvvm
    ,等等。如果需要,可以从此命名空间中删除
    UI
    ,因为实现暗示了它是什么。这通常依赖于
    UI
    项目,但会添加特定于特定UI模型的内容;控制器、演示者、视图模型等。这是您实际的“应用程序”。它也是您通常选择IoC容器(AutoFac、Ninject、Spring.NET、Castle、Unity)并将所有特定实现连接到抽象类型的地方

  • 在应用程序项目中,您希望将逻辑概念划分为不同的子名称空间/文件夹。例如,如果您开始获得大量屏幕(例如,
    视图。账单
    视图。配送
    ),请将您的演示者放置在
    演示者
    中,并将视图放置在
    视图
    中-非常简单-并在每个视图中创建子目录。也可以在此处创建顶级
    区域
    目录/名称空间,并在每个区域中放置单独的
    演示者
    视图
    ,等等。这是ASP.NET MVC当前采用的方法

您不需要将
演示者
视图
分为不同的项目。请放心,您为MVP定制的视图对MVC或MVVM完全没有用处,反之亦然。模型驱动的应用程序中唯一有可能被重用的部分就是模型本身

请注意,对于一个只有一个数据库和相对简单的域逻辑的应用程序来说,这只是一个非常基本的体系结构。它不包括任何更高级别的后端构造,如应用程序集成(如web服务)、事件(发布/订阅)、批处理、CQS、即席报告等。这些在更大规模的商业应用程序中很常见,但如果你刚刚开始使用一个新的社交书签应用程序,那么你就不需要那么复杂了


另外请注意:这都是假设您正在计划至少一个中等规模的项目——假设您和/或您的团队将在6个月或更长时间内完成一个项目。如果您计划在一个月或更短的时间内完成这一切,请不要在解决方案体系结构上浪费时间。只要项目足够小,易于理解和维护,就可以将所有内容塞进一个项目中,并为域、实体和UI重用相同的类。仔细监视复杂性和维护开销,如果项目开始变成一个烂泥,就考虑重构到上面的结构中。

<代码>核>代码>通常保留在域类中,顺便说一下,它不应该在与数据模型相同的程序集/命名空间中。(假设您的项目实际上同时具有这两种功能).
UI
对于用户界面代码来说也是比
interface
更典型的约定。如果视图和演示者未分为两个不同的项目,那么如果我需要更改视图,该怎么办?在您的情况下,我需要在另一个项目中再次重写整个演示者模型。相反,您应该