我已经创建了一个基础设施,我们的品牌新的Intranet项目,并试图遵循几乎所有的最佳实践。另外我也想提一下,这是我第一次从零创建架构。为基于实体框架的基础设施实施有界的上下文
目前我的基础架构的第一个版本已经准备就绪并且工作正常。但是我想在下一个版本中实现有界的上下文结构。
我试图解释下面的现状。
DbCore:负责数据操作。实体框架5代码首次使用。只有一个DbContext类和其中定义的所有DbSets。此外,GenericRepository模式和工作单元模式基于以下接口实现。
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);
}
IUnitOfWork
public interface IUnitOfWork {
void Dispose();
IGenericRepository<Test> TestRepository {
get;
}
IGenericRepository<Log> LogRepository {
get;
}
void Save();
}
型号:用于DbCore和Entity Framework负责存储实体模型 域:表示业务逻辑层还存储的DTO的实体存储在Models项目中的对象。目前业务逻辑存储在服务类中实现的界面如下 IService
public interface IService<TEntity> {
IEnumerable<TEntity> Get();
TEntity GetByID(int id);
void Insert(TEntity entity);
}
这个服务类构造函数通过参数得到的UnitOfWork和使用操作。此外Automapper实现将实体对象转换为DTO或反之亦然。 从现在起,所有上层不再对实体模型感兴趣,只使用DTO。所以几乎所有的项目(包括api和web)都引用这个项目。
常见问题:负责存储常用的库,如日志记录。
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:有什么事情一定不能impelemented我使用的方法是什么?
问题2:实现有界上下文的最佳方法是什么?我最近观看了Julie Lerman的视频并回顾了很多示例项目。常见的事情,我看到从DbContext派生BC。但我无法确定。因为我曾经认为BC应该位于域(业务逻辑)层而不是DbCore(数据访问)层。
问题3:正如我上面提到的,我的Api和Web项目使用DTO,所以它们都需要引用Domain层。但我不喜欢它,因为我正在使用API与UI分离业务层,并将它们再次耦合到实体。但我找不到比这更好的方法。
这成了一个很长的问题,但如果您与我分享您的想法以创建更好的建筑,我将非常高兴。
想要在这里点击+1几百次! – 2013-02-15 14:32:35