Abi*_*aar 6 .net c# architecture dependency-injection inversion-of-control
我已经阅读了很少的文章并观看了很多有关DI和IoC的YT讲座/教程,但我没有在VS解决方案中找到任何推荐的目录布局.
我在谈论项目(例如游戏),你有几个类/接口,记录器,数据库提供程序,wcf服务,wpf表示层(实际上是不同的项目)......
是否有任何模式项目,显示我应该如何组织我的项目,接下来,有经验的程序员不会浪费时间搞清楚发生了什么?就像我们谈论"自我评论的代码"一样,我在谈论"自我评论的项目结构".
例如,我应该将所有接口放入"接口"目录吗?或者我应该(在记录器的情况下)创建"Logger"目录并将接口,类,类与扩展方法放在一起(所有,专注于日志记录).代码集中在Board,在"Board"目录中.单独的"Field"等目录等.
现在结构看起来像那样.我不确定那里的"商业"和Logger.我有不同目录中的接口,然后是其他记录器类.我应该致电Log4Net提供商吗?还是适配器?还是装饰者?它只是一个实现ILogger接口的记录器类.这是屏幕:链接
下面是示例代码(还没有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);
}
Run Code Online (Sandbox Code Playgroud)
xqt*_*qtr 11
应用核心项目
应用程序核心拥有业务模型,其中包括实体、服务和接口。这些接口包括将使用基础设施执行的操作的抽象,例如数据访问、文件系统访问、网络调用等。有时,在此层定义的服务或接口需要与不依赖于 UI 的非实体类型一起使用或基础设施。这些可以被定义为简单的数据传输对象(DTO)。
基础设施项目
基础设施项目通常包括数据访问实现。在典型的 ASP.NET Core Web 应用程序中,这些实现包括实体框架 (EF) DbContext、任何已定义的 EF Core 迁移对象以及数据访问实现类。抽象数据访问实现代码的最常见方法是使用存储库设计模式。
除了数据访问实现之外,基础设施项目还应包含必须与基础设施问题交互的服务的实现。这些服务应该实现应用程序核心中定义的接口,因此基础设施应该引用应用程序核心项目。
ASP.NET Core Web 应用程序项目
ASP.NET Core MVC 应用程序中的用户界面层是应用程序的入口点。该项目应引用Application Core项目,其类型应严格通过Application Core中定义的接口与基础设施进行交互。UI 层中不允许直接实例化或静态调用基础设施层类型。
使用 ASP.NET Core 进行清洁架构的起点存储库 https://github.com/ardalis/CleanArchitecture
我通常做的是我有一个MyApplication.Core(类库)层,它包含所有应用程序接口与少量(读取:无)第三方依赖关系,例如ILogger,ICommand或IQuery<TResult>.
接下来,我有一个MyApplication.Domain(类库)层,其中包含所有应用程序域特定的知识 - 这是业务层.这是核心接口的实现ICommand,IQuery<TResult>.然后,这些实现依赖于例如ILogger.从未具体实施.
然后我有MyApplication.Infrastructure(类库),这是实现所有服务接口的地方MyApplication.Core,例如ILogger.在这里,您可以依赖第三方库,例如Log4Net.
然后最后我有表示层,在我的情况下通常是一个MVC应用程序,所以我会这样命名MyApplication.Web.Mvc.所有控制器都只依赖于接口.从未具体实施.该层还负责使用Composition Root将所有接口引导到具体实现.
TL; DR: