您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

2026-03-30 18:511阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1413个文字,预计阅读时间需要6分钟。

最基本的:UI-BLL-DAL,这是我们熟悉的分层结构(补充:)我们的类通常都不是独立存在的。很多都是相互依赖的。比如,我们有一个Work类,在工作时需要将信息记录下来。

最基础的:UI-BLL-DAL

这是我们耳熟能详的分层

(补充:) 我们的类正常都不是孤立存在的。很多都是要依赖于其它的类。 比如说我们有一个Work类,Work类在工作的时候需要把信息记录下来。 MessageWriter就是 Worker的依赖项

首先我听到依赖注入之后看似非常的复杂

实际则是:为了实现不同的团队在不同的层上工作。我们可以让一个团队处理数据访问层,一个团队处理业务层,一个团队处理UI。

首先建立:最基本的三层架构

实体层:

public class Product { public Guid Id { get; set; } public string Name { get; set; } public string Description { get; set; } }

数据层:DAL

public class ProductDAL { private readonly List<Product> _products; public ProductDAL() { _products = new List<Product> { new Product { Id = Guid.NewGuid(), Name= "iPhone 9", Description = "iPhone 9 mobile phone" }, new Product { Id = Guid.NewGuid(), Name= "iPhone X", Description = "iPhone X mobile phone" } }; } public IEnumerable<Product> GetProducts() { return _products; } public IEnumerable<Product> GetProducts(string name) { return _products .Where(p => p.Name.Contains(name)) .ToList(); } }l

逻辑层:BLL

public class ProductBL { private readonly ProductDAL _productDAL; public ProductBL() { _productDAL = new ProductDAL(); } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }

UI层:UI

class Program { static void Main(string[] args) { ProductBL productBL = new ProductBL(); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); } }

UI - BLL - DAL 引用顺序

那么出现以下三个问题:

1.我们不能让三个不同的团队在每个层上工作。

2.业务层很难扩展,因为它依赖于数据访问层的实现。

3.业务层很难维护,因为它依赖于数据访问层的实现。

高级别对象不应该依赖于低级别对象。两者都必须依赖于抽象。那么抽象概念是什么呢?

抽象是功能的定义。在我们的例子中,业务层依赖于数据访问层来检索图书。在C#中,我们使用接口实现抽象。接口表示功能的抽象。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以下为修改后结构

数据层:DAL

DAL:接口

public interface IProductDAL { IEnumerable<Product> GetProducts(); IEnumerable<Product> GetProducts(string name); }

DAL:实现 

public class ProductDAL : IProductDAL

业务逻辑层:BLL  这样我们就做到了使其依赖于IDAL 抽象层,而不是DAL层直接实现:

public class ProductBL { private readonly IProductDAL _productDAL; public ProductBL() { _productDAL = new ProductDAL(); } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }

 

业务逻辑层:IBLL (同样的 UI 依赖于BLL 我们也这样做 搞个抽象层 接口)

public interface IProductBL { IEnumerable<Product> GetProducts(); IEnumerable<Product> GetProducts(string name); }

同理:更新BLL层:

public class ProductBL : IProductBL

UI层: 就和BLL依赖于DAL一样 UI依赖于BLL

class Program { static void Main(string[] args) { IProductBL productBL = new ProductBL(); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); }

  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以上为抽象层的建立,

还记得我们标红的地方吗?

public ProductBL() { _productDAL = new ProductDAL(); }

BLL依赖于IDAL ,但是 最终我们还是依赖于DAL

到目前为止,我们所做的工作都与依赖注入无关 

为了使处在BLL依赖于DAL的功能,而没有具体的实现,必须由其他人创建类。其他人必须提供底层对象的具体实现,这就是我们所说的依赖注入。它的字面意思是我们将依赖对象注入到更高级别的对象中。

实现依赖项注入的方法之一是使用构造函数进行依赖项注入。

更新业务层:

public class ProductBL : IProductBL { private readonly IProductDAL _productDAL; public ProductBL(IProductDAL productDAL) { _productDAL = productDAL; } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }

  

UI:

class Program { static void Main(string[] args) { IProductBL productBL = new ProductBL(new ProductDAL()); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); } }

  创建DAL控制与UI结合在一起。这也称为控制反转

我们不是在BLL中创建DAL的实例,而是在UI的中创建它。Main方法将把实例注入到业务逻辑层。因此,我们将低层对象的实例注入到高层对象的实例中。

这叫做依赖注入

现在,如果我们看一下代码,我们只依赖于业务访问层(BLL)中数据访问层(IDAL)的抽象,而业务访问层(BLL)是使用的是数据访问层实现的接口。因此,我们遵循了更高层次对象和更低层次对象都依赖于抽象的原则,抽象是更高层次对象和更低层次对象之间的契约。

接下来就显示了可维护性和可扩展性的好处。例如,如果我们想为SQL Server创建一个新的数据访问层,我们只需实现数据访问层的抽象并将实例注入基础设施中。

标签:UIBLLDAL

本文共计1413个文字,预计阅读时间需要6分钟。

最基本的:UI-BLL-DAL,这是我们熟悉的分层结构(补充:)我们的类通常都不是独立存在的。很多都是相互依赖的。比如,我们有一个Work类,在工作时需要将信息记录下来。

最基础的:UI-BLL-DAL

这是我们耳熟能详的分层

(补充:) 我们的类正常都不是孤立存在的。很多都是要依赖于其它的类。 比如说我们有一个Work类,Work类在工作的时候需要把信息记录下来。 MessageWriter就是 Worker的依赖项

首先我听到依赖注入之后看似非常的复杂

实际则是:为了实现不同的团队在不同的层上工作。我们可以让一个团队处理数据访问层,一个团队处理业务层,一个团队处理UI。

首先建立:最基本的三层架构

实体层:

public class Product { public Guid Id { get; set; } public string Name { get; set; } public string Description { get; set; } }

数据层:DAL

public class ProductDAL { private readonly List<Product> _products; public ProductDAL() { _products = new List<Product> { new Product { Id = Guid.NewGuid(), Name= "iPhone 9", Description = "iPhone 9 mobile phone" }, new Product { Id = Guid.NewGuid(), Name= "iPhone X", Description = "iPhone X mobile phone" } }; } public IEnumerable<Product> GetProducts() { return _products; } public IEnumerable<Product> GetProducts(string name) { return _products .Where(p => p.Name.Contains(name)) .ToList(); } }l

逻辑层:BLL

public class ProductBL { private readonly ProductDAL _productDAL; public ProductBL() { _productDAL = new ProductDAL(); } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }

UI层:UI

class Program { static void Main(string[] args) { ProductBL productBL = new ProductBL(); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); } }

UI - BLL - DAL 引用顺序

那么出现以下三个问题:

1.我们不能让三个不同的团队在每个层上工作。

2.业务层很难扩展,因为它依赖于数据访问层的实现。

3.业务层很难维护,因为它依赖于数据访问层的实现。

高级别对象不应该依赖于低级别对象。两者都必须依赖于抽象。那么抽象概念是什么呢?

抽象是功能的定义。在我们的例子中,业务层依赖于数据访问层来检索图书。在C#中,我们使用接口实现抽象。接口表示功能的抽象。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以下为修改后结构

数据层:DAL

DAL:接口

public interface IProductDAL { IEnumerable<Product> GetProducts(); IEnumerable<Product> GetProducts(string name); }

DAL:实现 

public class ProductDAL : IProductDAL

业务逻辑层:BLL  这样我们就做到了使其依赖于IDAL 抽象层,而不是DAL层直接实现:

public class ProductBL { private readonly IProductDAL _productDAL; public ProductBL() { _productDAL = new ProductDAL(); } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }

 

业务逻辑层:IBLL (同样的 UI 依赖于BLL 我们也这样做 搞个抽象层 接口)

public interface IProductBL { IEnumerable<Product> GetProducts(); IEnumerable<Product> GetProducts(string name); }

同理:更新BLL层:

public class ProductBL : IProductBL

UI层: 就和BLL依赖于DAL一样 UI依赖于BLL

class Program { static void Main(string[] args) { IProductBL productBL = new ProductBL(); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); }

  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以上为抽象层的建立,

还记得我们标红的地方吗?

public ProductBL() { _productDAL = new ProductDAL(); }

BLL依赖于IDAL ,但是 最终我们还是依赖于DAL

到目前为止,我们所做的工作都与依赖注入无关 

为了使处在BLL依赖于DAL的功能,而没有具体的实现,必须由其他人创建类。其他人必须提供底层对象的具体实现,这就是我们所说的依赖注入。它的字面意思是我们将依赖对象注入到更高级别的对象中。

实现依赖项注入的方法之一是使用构造函数进行依赖项注入。

更新业务层:

public class ProductBL : IProductBL { private readonly IProductDAL _productDAL; public ProductBL(IProductDAL productDAL) { _productDAL = productDAL; } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }

  

UI:

class Program { static void Main(string[] args) { IProductBL productBL = new ProductBL(new ProductDAL()); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); } }

  创建DAL控制与UI结合在一起。这也称为控制反转

我们不是在BLL中创建DAL的实例,而是在UI的中创建它。Main方法将把实例注入到业务逻辑层。因此,我们将低层对象的实例注入到高层对象的实例中。

这叫做依赖注入

现在,如果我们看一下代码,我们只依赖于业务访问层(BLL)中数据访问层(IDAL)的抽象,而业务访问层(BLL)是使用的是数据访问层实现的接口。因此,我们遵循了更高层次对象和更低层次对象都依赖于抽象的原则,抽象是更高层次对象和更低层次对象之间的契约。

接下来就显示了可维护性和可扩展性的好处。例如,如果我们想为SQL Server创建一个新的数据访问层,我们只需实现数据访问层的抽象并将实例注入基础设施中。

标签:UIBLLDAL