使用 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)第三方依赖项,例如ILoggerICommandIQuery<TResult>

接下来我有一个 MyApplication.Domain(Class 库)层,它包含所有应用程序领域的特定知识——这是业务层。这是核心接口 ICommandIQuery<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