我正在使用ASP.NET MVC3和SQL Server中的数据库开发Web应用程序项目。还有一个移动应用程序通过REST服务使用来自同一数据库的数据。以下是我的一些应用程序层:
模型 - 使用实体框架的ADO.NET数据模型
数据访问层 - 包含查询以从数据库中检索数据的存储库
Web应用程序 - MVC3项目,使用存储库,使用Structure Map和DI进行松散耦合,数据库上下文在HttpRequest结束时处理
核心 - DAL和服务层之间的另一个层,使用存储库并将数据公开给服务层。业务逻辑层排序。
服务层 - REST服务,了解Core层但不了解DAL。将数据映射到DTO并公开给客户端
我在这种应用程序架构中遇到的问题是服务层上的松散耦合。服务层引用了Core层。核心层引用了数据访问层并使用其存储库。但是,存储库没有默认构造函数。他们期望1个参数及其数据库对象上下文(一次性对象)。
直接在我的网站上使用存储库不是问题。我正在使用结构图和DI使它松散耦合。每个上下文都在HttpRequest的末尾处理。
问题在于服务层和核心层。我想在那里松耦合,但不知道如何实现它?如何将数据上下文注入其中并确保在某个时刻处置?我想听听一些关于如何将它们放在一起的建议。
答案 0 :(得分:5)
服务层引用了核心层。
没关系。
核心层引用了数据访问层并使用其存储库。
这不太好。
您的“核心”应该是您的域名,具有业务规则和逻辑。它不应该有任何依赖。
从堆栈底部开始:
这就是我们这样做的方式。我们使用接口驱动编程和依赖注入的组合来处理松散耦合。
示例流程:
ISomethingService
并解析它,包括任何进一步的依赖关系(服务,回购等)。ISomethingService
上的控制器调用方法。 ISomethingService
实施(由DI选择)调用ISomeRepo
上的方法。ISomeRepo
实现(由DI选择)调用EF / DB,返回“data-object”进行服务。这些对象的实例化应由您的DI容器处理。我们使用的上述唯一缺少的是“工作单元”,它基本上包含了EF上下文。
答案 1 :(得分:1)
public ServiceLayerClass()
{
private ICoreLayerClass coreLayerClass;
public ServiceLayerClass(ICoreLayerClass coreLayerClass)
{
this.coreLayerClass = coreLayerClass;
}
public void DoSomeWork()
{
coreLayerClass.DoSomeWork();
}
}
public CoreLayerClass()
{
private ISomeRepository someRepository;
public CoreLayerClass(ISomeRepository someRepository)
{
someRepository = this.someRepository;
}
public void DoSomeWork()
{
someRepository.DoSomeWork();
}
}
public SomeRepository()
{
public SomeRepository(IUnitOfWork uow)
{
}
public void DoSomeWork()
{
//do some work
}
}
注意: 理想情况下,每个HttpContext都会创建UnitOfWork。也就是说,您的datacontext将在开始请求时开始其生命,并将在最后处置。每个请求只能使用一个。