我在谈论项目(例如游戏),你有几个类/接口,记录器,数据库提供程序,wcf服务,wpf表示层(实际上是不同的项目)……
是否有任何模式项目,显示我应该如何组织我的项目,接下来,有经验的程序员不会浪费时间搞清楚发生了什么?就像我们谈论“自我评论的代码”一样,我在谈论“自我评论的项目结构”.
例如,我应该将所有接口放入“接口”目录吗?或者我应该(在记录器的情况下)创建“Logger”目录并将接口,类,类与扩展方法放在一起(所有,专注于日志记录).代码集中在Board,在“Board”目录中.单独的“Field”等目录等.
现在结构看起来像那样.我不确定那里的“商业”和Logger.我有不同目录中的接口,然后是其他记录器类.我应该致电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); }
解决方法
接下来,我有一个MyApplication.Domain(类库)层,它包含所有应用程序域特定的知识 – 这是业务层.这是核心接口ICommand,IQuery< 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(演示和组合根层)