我已经为我们全新的 Intranet 项目创建了一个基础架构,并尝试遵循几乎所有的最佳实践。我还想提一下,这是我第一次从零开始创建架构。
目前我的基础设施的第一个版本已经准备好并且运行良好。但我想在下一个版本中实现有界上下文结构。
我试图在下面解释当前的情况。
DbCore:负责数据操作。Entity Framework 5 代码首次使用。只有一个 DbContext 类和其中定义的所有 DbSet。GenericRepository 模式和 Unit of Work 模式也是基于以下接口实现的。
IGenericRepository
public interface IGenericRepository<TEntity>
where TEntity : class {
void Delete(object id);
void Delete(TEntity entityToDelete);
System.Collections.Generic.IEnumerable<TEntity> Get(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null, Func<System.Linq.IQueryable<TEntity>, System.Linq.IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");
System.Collections.Generic.IEnumerable<TEntity> GetAll();
TEntity GetByID(object id);
System.Collections.Generic.IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters);
void Insert(TEntity entity);
void Update(TEntity entityToUpdate);
}
工作单位
public interface IUnitOfWork {
void Dispose();
IGenericRepository<Test> TestRepository {
get;
}
IGenericRepository<Log> LogRepository {
get;
}
void Save();
}
Models:负责存储 DbCore 和 Entity Framework Domain 的实体模型:表示业务逻辑层还存储存储在 Models 项目中的实体对象的 DTO。当前业务逻辑存储在实现以下接口IService的 Service 类中
public interface IService<TEntity> {
IEnumerable<TEntity> Get();
TEntity GetByID(int id);
void Insert(TEntity entity);
}
该服务类通过 ctor 参数获取 UnitOfWork 并用于操作。Automapper 还实现了将实体对象转换为 DTO,反之亦然。从现在开始,所有上层不再对实体模型感兴趣,只使用 DTO。所以几乎所有的项目(包括 api 和 web )都引用了这个项目。
Common:负责存储常用的库,如日志记录。
WebCore:负责存储 API 或 MVC 等基于 Web 的项目的常用库。还包含基于 MVC 的项目的扩展、处理程序和过滤器。
Api: ASP.Net MVC Web API 项目代表服务层。使用域层并服务于客户端。控制器获取 IService 接口作为 ctor 参数,并使用它通过域层访问数据层。
Web:基于 ASP.Net MVC 4 的 Web 项目,负责与用户交互。使用 Api 方法来访问数据。所有控制器都有一个名为 IConsumeRepository 的接口,它通过 HttpClient 连接 API。
public interface IConsumeRepository<TEntity> {
Task<TEntity> Create(TEntity TestInfo);
Task Delete(int id);
Task<IEnumerable<TEntity>> Get();
Task<TEntity> Get(int id);
TEntity New();
Task<TEntity> Update(TEntity TestInfo, int entityId);
}
Autofac 负责所有项目的 IoC 和 DI。
现在这是我当前的基础设施,我想我解释了需要评估的所有内容。
现在我试图弄清楚以下事情,
问题1:有什么不能像我使用的那样被执行吗?
问题 2:实现限界上下文的最佳方法是什么?我最近观看了 Julie Lerman 的视频并查看了许多示例项目。我看到从 DbContext 派生 BC 的常见事情。但我不能确定。因为我认为 BC 应该在域(业务逻辑)层而不是 DbCore(数据访问)层。
问题 3:正如我上面提到的,我的 Api 和 Web 项目使用 DTO,因此它们都需要引用域层。但我不喜欢它,因为我使用 API 将业务层与 UI 分开,并为实体再次耦合它们。但我找不到比这更好的方法了。
这是一个很长的问题,但如果您与我分享您的想法以创建更好的架构,我将非常高兴。