我只是试图了解PostSharp和老实说,我认为这是惊人的。
但有一两件事,这是我很难怎样一个纯粹的依赖注入(没有服务定位器)cannot be done在PostSharp方面,也许在我的理解是编译时编织的结果。
从PHP背景来了,Symfony的具有JMSAopBundle仍允许依赖被注入到它的拦截器。
不净有同样的功能有些库?
还是我失去了与PostSharp的东西吗?
我不认为你在这里失去了什么,限制确实是使用编译时编织的结果。
虽然我觉得编译时编织工具有它在软件开发的地方,我觉得自己是经常被滥用。我经常看到他们被用来修补在应用设计上的缺陷。在我建立的应用我申请的通用接口,以一定的建筑概念。举例来说,我定义:
ICommandHandler<TCommand>
接口,用于实现某一特定用途的情况下,服务;IQueryHandler<TQuery, TResult>
接口,用于执行一个查询服务;IRepository<TEntity>
接口作为抽象超过存储库;IValidator<TCommand>
接口,用于执行消息验证部件;这使我能够创造这样的组文物的一个通用的装饰(例如,允许运行在自己的事务每个用例的TransactionCommandHandlerDecorator<TCommand>
)。使用装饰有许多优点,如:
很多人都写了这种应用设计;下面是我自己写的几篇文章:
UPDATE
装饰是伟大的,但我喜欢AOP是它的建议的概念和连接点。有没有一种方法来模拟与装饰相同的能力?我只能想到反射的现在。
一个连接点是一个“其中一个问题是要附加一个类中明确定义的位置”。当您使用的装饰应用AOP,你会被“限制”的加盟是对法的边界点。然而,如果你坚持SRP,OCP和ISP,你会有很瘦的接口(通常是用单一的方法)。如果这样做,你会发现,几乎没有以往任何时候都具有类中的任何其他地方的一个连接点的理由。
一个建议是“关注,这将潜在地改变目标方法的输入和/或输出”。当装饰和基于消息的设计(我在这里推广的东西)工作,您的咨询需要更改消息(或替换更改后的值完整消息)或更改输出值。事情并不比代码那么多不同的织如果你申请的咨询,必须有建议适用于所有的代码之间的共同之处。