正确的n层应用程序引用方法

时间:2016-08-28 16:48:18

标签: c# entity-framework

我对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层概念。 那么,我该如何处理这个问题呢?我搜索了一些关于使用自动映射器的内容......

2 个答案:

答案 0 :(得分:2)

在这里,我不是直接为您的用例提供解决方案。但我想提供实现复杂的NLayer架构应用程序的正确途径。

什么是NLayer架构

  

应用程序代码库的分层是一种广泛接受的技术   帮助降低复杂性并提高代码可重用性。实现   分层架构,我们可以遵循原则   域驱动设计。在域驱动设计中有四个   基本层面:

     

表示层:为用户提供界面。使用   应用层实现用户交互。

     

应用层:在演示文稿和域之间进行调解   层。编排业务对象以执行特定应用程序   任务。

     

域层:包含业务对象及其规则。这是心脏   申请书。

     

基础设施层提供通用技术功能   支持更高层。基础架构层的示例可以是a   用于通过数据库与数据库交互的存储库实现   ORM框架,或电子邮件提供商发送的实现   电子邮件。

根据需要可能会添加其他图层。一个例子是:

  

分布式服务层用于向其公开应用程序功能   远程客户。可以使用ASP.NET Web API和WCF等工具   提供这一层。这些都是以域为中心的常见层   建筑。根据实施情况可能存在细微差别。

图层和结构概述如下所示:

enter image description here

这是一个包含五个项目的解决方案,用于简单的分层应用程序:

enter image description here

如果您想了解更多相关信息,我强烈建议您研究下面提到的项目。 免费和开源

ASP.NET Boilerplate

答案 1 :(得分:1)

来自wiki(https://en.wikipedia.org/wiki/Multitier_architecture):

DAL"封装持久性机制并公开数据"。

患者类不是DAL的一部分,但是DAL暴露给上层的数据。

我认为有两种可能的观点:

  1. DefaultRepository类不应该在BLL中,而应在DAL中。您在Console中的代码应该是BLL
  2. DefaultRepository是BLL,EntityFramework用作DAL。
  3. 无论如何,你的实体"学生"只是一块可以共享的数据。

    如果采用更具体的模式,如MVC:V(View)和C​​(Controller)知道M(模型)。

    总结一下,你可以:

    1. 创建第4个项目,该项目将由所有项目共享,并包含您的实体(或这些实体的接口)。
    2. 不要打扰并添加从控制台到DAL的链接。最重要的是DAL没有链接到BLL和控制台。