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

时间:2015-09-07 20:01:05

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

我已经阅读了很多文章并观看了很多有关DI和IoC的YT讲座/教程,但我没有在VS解决方案中找到任何推荐的目录布局。

我正在讨论项目(例如游戏),你有几个类/接口,记录器,数据库提供程序,wcf服务,wpf表示层(实际上是不同的项目)......

是否有任何模式项目,它显示了我应该如何组织我的项目,接下来,有经验的程序员不会浪费时间搞清楚会发生什么?就像我们正在谈论"自我评论的代码",我正在谈论"自我评论的项目结构"。

例如,我应该将所有接口放入"接口"目录?或者我应该(在记录器的情况下)创建"记录器"目录并将接口,类,类与扩展方法(所有,专注于日志记录)放在一起。代码集中在董事会,董事会和#34;目录。单独编目" Field"等等。

现在结构看起来像那样。我不确定" Business"那里和记录器。我有不同目录中的接口,然后是其他记录器类。我应该致电Log4Net提供商吗?还是适配器?还是装饰者?它只是一个实现ILogger接口的记录器类。这是屏幕: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);
}

2 个答案:

答案 0 :(得分:8)

我通常做的是我有一个MyApplication.Core(类库)层,它包含所有应用程序接口,只有少量(读取:无)第三方依赖项,例如: ILoggerICommandIQuery<TResult>

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

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

然后最后我有了表示层,在我的情况下通常是MVC应用程序,因此我将其命名为MyApplication.Web.Mvc。所有控制器都只依赖于接口。从未具体实施。该层还负责使用Composition Root将所有接口引导到具体实现。

TL; DR:

  • MyApplication.Core(应用程序接口层)
  • MyApplication.Domain(业务逻辑)
  • MyApplication.Infrastructure(应用程序接口层的实现)
  • MyApplication.Web.Mvc(演示文稿和撰写根层)

答案 1 :(得分:1)

来自Microsoft's "Common web application architectures"

enter image description here

enter image description here

应用核心项目

应用程序核心拥有业务模型,其中包括实体,服务和接口。这些接口包括将使用基础结构执行的操作的抽象,例如数据访问,文件系统访问,网络调用等。有时,在此层定义的服务或接口将需要使用不依赖于UI的非实体类型或基础架构。这些可以定义为简单的数据传输对象(DTO)。

基础设施项目

基础结构项目通常包括数据访问实现。在典型的ASP.NET Core Web应用程序中,这些实现包括实体框架(EF)DbContext,已定义的任何EF Core迁移对象以及数据访问实现类。提取数据访问实现代码的最常见方法是使用存储库设计模式。

除了数据访问实现之外,基础结构项目还应包含必须与基础结构问题交互的服务的实现。这些服务应实现在Application Core中定义的接口,因此Infrastructure应具有对Application Core项目的引用。

ASP.NET Core Web App项目

ASP.NET Core MVC应用程序中的用户界面层是该应用程序的入口点。该项目应引用Application Core项目,其类型应严格通过Application Core中定义的接口与基础结构进行交互。 UI层中不允许直接实例化或静态调用Infrastructure层类型。

带有ASP.NET Core的Clean Architecture的起点仓库 https://github.com/ardalis/CleanArchitecture