使用 IoC 的项目中目录的推荐文件夹结构是什么
What's the recommended folder structure of catalogs in project using IoC
我在 YT 上阅读了一些文章并观看了很多 lectures/tutorials 关于 DI 和 IoC,但我没有在 VS 解决方案中找到任何推荐的目录布局。
我说的是项目(例如游戏),您几乎没有 classes/interfaces、记录器、数据库提供程序、wcf 服务、wpf 表示层(这实际上是不同的项目)...
是否有任何模式项目,表明我应该如何组织我的项目,以便接下来,有经验的程序员不会浪费时间弄清楚发生了什么?就像我们在谈论 "self commented code",我在谈论 "self commented project structure"。
例如,我是否应该将所有接口都放入"Interfaces"目录中?或者我应该(在记录器的情况下)创建 "Logger" 目录并将接口 classes,class 与扩展方法(全部,专注于日志记录)放在那里。代码集中在Board,在"Board"目录下。 "Field" 等的单独目录。
现在的结构看起来像那样。我不确定那里的 "Business" 和 Logger。我在不同的目录中有接口,然后其他记录器 classes。我应该打电话给 Log4Net 提供商吗?或适配器?或装饰?它只是一个实现 ILogger
接口的记录器 class。这是屏幕:link
这里是示例代码(目前还没有IoC,但是大家会注意到那里映射了3个接口。非常简单):
public class Game
{
public IBoard Board { get; set; }
public Game(IBoard board)
{
Board = board;
}
}
public interface IBoard {}
public class Board : IBoard
{
public IField[,] Fields { get; set; }
public Board(IField field, int boardWidth, int boardHeight)
{
Fields = new IField[boardHeight, boardWidth];
Fields.Initialize();
}
}
public interface IField {}
public class Field : IField {}
public interface ILogger
{
void Log(LogEntry entry);
}
我通常做的是,我有一个 MyApplication.Core
(Class 库)层,它包含了所有应用程序接口和尽可能少的(读取:none)第三方依赖项,例如ILogger
、ICommand
或 IQuery<TResult>
。
接下来我有一个 MyApplication.Domain
(Class 库)层,它包含所有应用程序领域的特定知识——这是业务层。这是核心接口 ICommand
、IQuery<TResult>
的实现。然后这些实现依赖于例如ILogger
。从来没有具体的实施。
然后我有 MyApplication.Infrastructure
(Class 库),这是实现 MyApplication.Core
中所有服务接口的地方,例如ILogger
。这里可以依赖第三方库,比如Log4Net。
最后是表示层,在我的例子中通常是 MVC 应用程序,因此我将其命名为 MyApplication.Web.Mvc
。所有控制器都只依赖于接口。从不具体实施。该层还负责使用 Composition Root.
将所有接口引导到具体实现
长话短说:
- MyApplication.Core(应用接口层)
- MyApplication.Domain(业务逻辑)
- MyApplication.Infrastructure(应用接口层的实现)
- MyApplication.Web.Mvc(表示和组合根层)
来自 Microsoft's "Common web application architectures".
应用程序核心项目
应用程序核心拥有业务模型,包括实体、服务和接口。这些接口包括对将使用基础设施执行的操作的抽象,例如数据访问、文件系统访问、网络调用等。有时在这一层定义的服务或接口需要与不依赖于 UI 或基础设施。这些可以定义为简单的数据传输对象 (DTO)。
基础设施项目
基础设施项目通常包括数据访问实现。在典型的 ASP.NET 核心 Web 应用程序中,这些实现包括 Entity Framework (EF) DbContext、任何已定义的 EF 核心迁移对象和数据访问实现 类。抽象数据访问实现代码的最常见方法是通过使用存储库设计模式。
除了数据访问实现之外,基础设施项目还应该包含必须与基础设施问题交互的服务的实现。这些服务应实现应用程序核心中定义的接口,因此基础结构应引用应用程序核心项目。
ASP.NET 核心 Web 应用程序项目
ASP.NET 核心 MVC 应用程序中的用户界面层是应用程序的入口点。该项目应引用 Application Core 项目,其类型应严格通过 Application Core 中定义的接口与基础设施进行交互。 UI 层中不应允许直接实例化或静态调用基础结构层类型。
具有 ASP.NET 核心 的清洁架构的起点回购
https://github.com/ardalis/CleanArchitecture
我在 YT 上阅读了一些文章并观看了很多 lectures/tutorials 关于 DI 和 IoC,但我没有在 VS 解决方案中找到任何推荐的目录布局。
我说的是项目(例如游戏),您几乎没有 classes/interfaces、记录器、数据库提供程序、wcf 服务、wpf 表示层(这实际上是不同的项目)...
是否有任何模式项目,表明我应该如何组织我的项目,以便接下来,有经验的程序员不会浪费时间弄清楚发生了什么?就像我们在谈论 "self commented code",我在谈论 "self commented project structure"。
例如,我是否应该将所有接口都放入"Interfaces"目录中?或者我应该(在记录器的情况下)创建 "Logger" 目录并将接口 classes,class 与扩展方法(全部,专注于日志记录)放在那里。代码集中在Board,在"Board"目录下。 "Field" 等的单独目录。
现在的结构看起来像那样。我不确定那里的 "Business" 和 Logger。我在不同的目录中有接口,然后其他记录器 classes。我应该打电话给 Log4Net 提供商吗?或适配器?或装饰?它只是一个实现 ILogger
接口的记录器 class。这是屏幕:link
这里是示例代码(目前还没有IoC,但是大家会注意到那里映射了3个接口。非常简单):
public class Game
{
public IBoard Board { get; set; }
public Game(IBoard board)
{
Board = board;
}
}
public interface IBoard {}
public class Board : IBoard
{
public IField[,] Fields { get; set; }
public Board(IField field, int boardWidth, int boardHeight)
{
Fields = new IField[boardHeight, boardWidth];
Fields.Initialize();
}
}
public interface IField {}
public class Field : IField {}
public interface ILogger
{
void Log(LogEntry entry);
}
我通常做的是,我有一个 MyApplication.Core
(Class 库)层,它包含了所有应用程序接口和尽可能少的(读取:none)第三方依赖项,例如ILogger
、ICommand
或 IQuery<TResult>
。
接下来我有一个 MyApplication.Domain
(Class 库)层,它包含所有应用程序领域的特定知识——这是业务层。这是核心接口 ICommand
、IQuery<TResult>
的实现。然后这些实现依赖于例如ILogger
。从来没有具体的实施。
然后我有 MyApplication.Infrastructure
(Class 库),这是实现 MyApplication.Core
中所有服务接口的地方,例如ILogger
。这里可以依赖第三方库,比如Log4Net。
最后是表示层,在我的例子中通常是 MVC 应用程序,因此我将其命名为 MyApplication.Web.Mvc
。所有控制器都只依赖于接口。从不具体实施。该层还负责使用 Composition Root.
长话短说:
- MyApplication.Core(应用接口层)
- MyApplication.Domain(业务逻辑)
- MyApplication.Infrastructure(应用接口层的实现)
- MyApplication.Web.Mvc(表示和组合根层)
来自 Microsoft's "Common web application architectures".
应用程序核心项目
应用程序核心拥有业务模型,包括实体、服务和接口。这些接口包括对将使用基础设施执行的操作的抽象,例如数据访问、文件系统访问、网络调用等。有时在这一层定义的服务或接口需要与不依赖于 UI 或基础设施。这些可以定义为简单的数据传输对象 (DTO)。
基础设施项目
基础设施项目通常包括数据访问实现。在典型的 ASP.NET 核心 Web 应用程序中,这些实现包括 Entity Framework (EF) DbContext、任何已定义的 EF 核心迁移对象和数据访问实现 类。抽象数据访问实现代码的最常见方法是通过使用存储库设计模式。
除了数据访问实现之外,基础设施项目还应该包含必须与基础设施问题交互的服务的实现。这些服务应实现应用程序核心中定义的接口,因此基础结构应引用应用程序核心项目。
ASP.NET 核心 Web 应用程序项目
ASP.NET 核心 MVC 应用程序中的用户界面层是应用程序的入口点。该项目应引用 Application Core 项目,其类型应严格通过 Application Core 中定义的接口与基础设施进行交互。 UI 层中不应允许直接实例化或静态调用基础结构层类型。
具有 ASP.NET 核心 的清洁架构的起点回购 https://github.com/ardalis/CleanArchitecture