使用Autofac在.NET中应用装饰器模式

使用Autofac在.NET中应用装饰器模式
俄罗斯娃娃-隐喻扩展给定功能的行为。 Maxpixel借来的照片。

我主张在开发应用程序时遵循良好的设计原则和结构。

随着开发过程的进行,我们向我们的应用程序添加了新功能:这可能是客户的功能要求,也可能是您建议的改进。 无论如何,这些即将发生的更改也将更改已经给定的代码库。 引入更改后,我们希望此操作尽可能简单。

在这篇文章中,我将向您展示一个示例,说明如何在想要将功能扩展到现有功能的情况下,将装饰器模式与功能强大的IoC容器Autofac结合使用。

假设您将要建立一个服务于产品的服务。 我们将此服务称为IProductRepository ,为简单起见,我们仅使用一种称为GetById的方法。 看起来像这样,并连接了一个实现:

通常,您可以使用以下代码行将具体的实现XmlProductRepository注册为IProductRepository,以支持依赖关系反转原理

可以说,一段时间后,您需要在获取产品时进行一些日志记录。 您是如何做到的?

通过注入这样的日志记录服务来修改XmlProductRepository实现很诱人:

但这违反了开放/封闭原则 原则规定不允许修改类,但可以扩展它们。 在这里,装饰器模式非常方便。

通过添加日志记录代理并将其注册为装饰器,可以扩展其原始结构,而不是使您的原始实现复杂化。

不过,您将不得不修改一条代码行,而那一行是原始实现的注册。 现在将需要进行命名注册,以便我们在注册装饰器时可以引用它:

然后连接并注册装饰器:

在这里我们用来指代实现的关键是productRepository 当您具有此代码时,在注入IProductRepository时将要调用的第一个类是LoggingProductRepositoryProxy,并且由于我们向其注入了内部实现,因此它将在打开/关闭后仅作为代理(俄罗斯娃娃样式)工作原理。

假设您遇到的XmlProductRepository速度很慢,并且需要将产品缓存一段时间。 您将如何实施? 在日志记录实现的顶部添加另一个装饰器是很容易的:

相当灵活!

在支持应用程序中的横切关注点时,装饰器模式非常强大。

您觉得这篇文章有用吗? 你知道该做什么! ????

From: https://hackernoon.com/apply-the-decorator-pattern-in-net-using-autofac-957502b771f7