c# - 使用 IoC 的项目中目录的推荐文件夹结构是什么

标签 c# .net dependency-injection architecture inversion-of-control

我读过一些文章,也看过很多关于 DI 和 IoC 的 YT 讲座/教程,但我没有在 VS 解决方案中找到任何推荐的目录布局。

我说的是项目(例如游戏),其中只有很少的类/接口(interface)、记录器、数据库提供程序、wcf 服务、wpf 表示层(这实际上是不同的项目)...

是否有任何模式项目,表明我应该如何组织我的项目,这样接下来,有经验的程序员就不会浪费时间弄清楚发生了什么?就像我们在谈论“ self 评论的代码”一样,我在谈论“ self 评论的项目结构”。

例如,我是否应该将所有接口(interface)都放入“Interfaces”目录中?或者我应该(在记录器的情况下)创建“记录器”目录并将接口(interface)、类、具有扩展方法的类(全部,专注于日志记录)放在那里。代码集中在Board,在“Board”目录中。 “字段”等的单独目录。

现在的结构看起来像那样。我不确定那里的“业务”和 Logger。我在不同的目录中有接口(interface),然后是其他记录器类。我应该调用 Log4Net 提供商吗?或适配器?或装饰?它只是一个实现 ILogger 接口(interface)的记录器类。这是屏幕:link

下面是示例代码(目前还没有IoC,但是大家会注意到那里映射了3个接口(interface),非常简单):

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 (类库)层,它包含所有应用程序接口(interface),具有尽可能少的(读取:无)第三方依赖项,例如ILogger , ICommandIQuery<TResult> .

接下来我有一个 MyApplication.Domain (类库)层,其中包含所有应用程序领域的特定知识——这是业务层。这是核心接口(interface)的实现 ICommand , IQuery<TResult> .然后这些实现依赖于例如ILogger .从不具体实现。

然后我有 MyApplication.Infrastructure (类库)这是所有服务接口(interface)来自 MyApplication.Core 的地方已实现,例如ILogger .这里可以依赖第三方库,比如Log4Net。

最后是表示层,在我的例子中通常是 MVC 应用程序,所以我将其命名为 MyApplication.Web.Mvc .所有 Controller 都只依赖于接口(interface)。从不具体实现。该层还负责使用 Composition Root 将所有接口(interface)引导至具体实现。 .

长话短说:

  • MyApplication.Core(应用接口(interface)层)
  • MyApplication.Domain(业务逻辑)
  • MyApplication.Infrastructure(应用接口(interface)层的实现)
  • MyApplication.Web.Mvc(表示和组合根层)

关于c# - 使用 IoC 的项目中目录的推荐文件夹结构是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445333/

相关文章:

asp.net - 将 IoC 依赖注入(inject)自定义 HTTP 模块 - 如何? (ASP.NET)

c# - 当 'object' 的某个字段可以有多种类型时,如何访问它而不将其转换为一种类型?

c# - Devexpress GridControl - 在 MVVM 中刷新数据

c# - 在 .NET 中使用线程时出现 WebClient 错误

c# - System.StackOverflowException 未处理 - C#、.NET

dependency-injection - 我的 Unity DI 容器中所有对象的列表

c# - 在不使用接口(interface)的情况下访问 F# 记录基本属性

c# - 计算进度百分比

c# - 设置默认 CurrentCulture 和 CurrentUICulture(.NET 4.5.2 和 .NET 4.6 之间的差异)

ruby-on-rails - Angular 依赖注入(inject) - @Injectable() 在测试中失败,而 @Inject() 有效