正如您所提到的,该接口用于解耦Core
系统和Web
应用程序之间的关系。假设您将所有业务逻辑放在项目的段Core
中,并让Web
应用程序使用此业务逻辑,接口表示您要在.Core
回答您的每个问题:
1 - Core项目中的接口什么时候使用?我们是否给它提供接口以便 EF 可以访问数据库?
您的Web
应用程序是使用(或使用)您的IBusinessLayer
界面的应用程序,它公开了对您的数据存储的访问权限(通过实体框架)。
2 - 接口是否只是Core用来访问实现版本的代理,以便EF可以访问真实数据?
是的。但在这种情况下,您谈论的是一个不同的接口,IDataAccessObject
由 实现EFDataAccessObject
。这里的想法是,将来您可能希望切换到另一个 ORM,例如OtherORMDataAccessObject
实现IDataAccessObject
,并保持项目的其余部分(Core
和Web
)保持不变。
3 - 如果是这样,依赖注入在这里扮演什么角色?我们要注入什么依赖项(核心取决于 web,web 取决于核心),在哪里,为什么?
依赖注入就是这样:一种通过注册单个具体类型来为所有这些接口注入实现的方法,您可以动态配置和计算。基本上,对于每个,
public WebClass
{
public IBusinessLayer BusinessLayer { get; set; } // <-- Dependency
}
public BusinessClass
{
public IProjectDB ProjectDB { get; set; } // <-- Dependency
}
...
public Main()
{
DependencyInjector
.Register<IBusinessLayer>().With<ConcreteBusinessLayer>().
.Register<IProjectDB>().With<EntityFrameworkProjectDB>();
}
...
1 - 假设服务层管理所有数据访问,我可以将“ProjectDb”移动到服务项目中,对吗?
是的。只需使系统成为您层Core
的依赖项,Service
public ServiceClass
{
public IBusinessLayer BusinessLayer { get; set; } // <-- Dependency
}
public WebClass
{
public IServiceLayer ServiceLayer { get; set; } // <-- Dependency
}
如您所见,Core
层和层的实现ProjectDB
保持不变,您只需将Business
依赖项从Web
to移动Service
并创建对层的Service
依赖项。Web
2 - Web 现在需要访问服务......所以我想我需要在 Web 项目中创建一个接口,该接口在服务项目中实现。在另一个问题中,有人告诉我这是错误的,接口和定义都应该存在于服务层中,这对我来说违背了接口的目的。有人可以为我澄清一下吗?
这与上一个问题有关:接口是在层项目IServiceLayer
中定义和实现的。Service
您使用此接口从Web
层使用您的服务,但这只是一个依赖项,因此,
public WebClass
{
public IServiceLayer ServiceLayer { get; set; } // <-- Dependency
}