我对n层架构有点新,并通过实现一个简单的控制台应用程序来学习它。
我有3个项目:
使用域实体和DbContext类进行DAL。
BLL与存储库类。
控制台应用程序只是为了运行它。
由于我在DAL中定义的所有实体,BLL图层都引用了DAL,如下所示:
public class DefaultRepository
{
private DefaultDbContext _repository;
private void SaveChanges()
{
try
{
_repository.SaveChanges();
}
catch (Exception e)
{
Console.WriteLine("Exception were caught");
Console.WriteLine(e.Message);
}
}
public void AddPatient(Patient patient)
{
_repository.Patients.Add(patient);
SaveChanges();
}
public Patient GetPatientById(int id)
=> _repository.Patients.Find(id) ?? null;
public void AddVisit(int patientId, Visit visit)
{
GetPatientById(patientId)?.Visits.Add(visit);
SaveChanges();
}
public DefaultRepository()
{
_repository = new DefaultDbContext();
}
}
显而易见的问题是我无法在我的控制台应用程序项目中使用存储库,因为控制台应用程序没有引用DAL级别。以下代码出现编译时异常。
DefaultRepository repository = new DefaultRepository();
repository.AddPatient(new Patient());
当然,我可以通过在ConsoleApplication项目中添加对DAL的引用来解决它。但是,据我所知,绝对破坏了n层概念。 那么,我该如何处理这个问题呢?我搜索了一些关于使用自动映射器的内容......
答案 0 :(得分:2)
在这里,我不是直接为您的用例提供解决方案。但我想提供实现复杂的NLayer架构应用程序的正确途径。
什么是NLayer架构
应用程序代码库的分层是一种广泛接受的技术 帮助降低复杂性并提高代码可重用性。实现 分层架构,我们可以遵循原则 域驱动设计。在域驱动设计中有四个 基本层面:
表示层:为用户提供界面。使用 应用层实现用户交互。
应用层:在演示文稿和域之间进行调解 层。编排业务对象以执行特定应用程序 任务。
域层:包含业务对象及其规则。这是心脏 申请书。
基础设施层提供通用技术功能 支持更高层。基础架构层的示例可以是a 用于通过数据库与数据库交互的存储库实现 ORM框架,或电子邮件提供商发送的实现 电子邮件。
根据需要可能会添加其他图层。一个例子是:
分布式服务层用于向其公开应用程序功能 远程客户。可以使用ASP.NET Web API和WCF等工具 提供这一层。这些都是以域为中心的常见层 建筑。根据实施情况可能存在细微差别。
图层和结构概述如下所示:
这是一个包含五个项目的解决方案,用于简单的分层应用程序:
如果您想了解更多相关信息,我强烈建议您研究下面提到的项目。 免费和开源 。
答案 1 :(得分:1)
来自wiki(https://en.wikipedia.org/wiki/Multitier_architecture):
DAL"封装持久性机制并公开数据"。
患者类不是DAL的一部分,但是DAL暴露给上层的数据。
我认为有两种可能的观点:
无论如何,你的实体"学生"只是一块可以共享的数据。
如果采用更具体的模式,如MVC:V(View)和C(Controller)知道M(模型)。
总结一下,你可以: