【问题标题】:Correct approach of referencing in n-layer applicationn 层应用程序中引用的正确方法
【发布时间】:2017-01-04 17:42:22
【问题描述】:

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

【问题讨论】:

  • 将(poco)域实体放在他们自己的项目中,并从控制台应用程序中引用它

标签: c# entity-framework


【解决方案1】:

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

什么是 NLayer 架构

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

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

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

域层:包括业务对象及其规则。这是心 应用程序。

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

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

分布式服务层:用于将应用程序功能暴露给 远程客户端。有像 ASP.NET Web API 和 WCF 这样的工具可以 提供这一层。这些都是以领域为中心的公共层 建筑学。根据实现可能会有细微差别。

层和结构概述如下:

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

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

ASP.NET Boilerplate

【讨论】:

  • 如果您在学习上述框架方面需要任何帮助,请告诉我。我会帮助您:)
【解决方案2】:

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

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

Patient 类不是 DAL 的一部分,而是 DAL 向上层公开的数据。

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

  1. DefaultRepository 类不应在 BLL 中,而应在 DAL 中。您在控制台中的代码应该在 BLL 中
  2. DefaultRepository 是 BLL,EntityFramework 用作 DAL。

无论如何,您的实体“学生”只是一个可以共享的数据。

如果您采用更具体的模式,例如 MVC:V(视图)和 C(控制器)知道 M(模型)。

总结一下,你可以:

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

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2010-10-23
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多