依赖注入使用编译时织入? [关闭]

问题描述 投票:12回答:1

我只是试图了解PostSharp和老实说,我认为这是惊人的。

但有一两件事,这是我很难怎样一个纯粹的依赖注入(没有服务定位器)cannot be done在PostSharp方面,也许在我的理解是编译时编织的结果。

从PHP背景来了,Symfony的具有JMSAopBundle仍允许依赖被注入到它的拦截器。

不净有同样的功能有些库?

还是我失去了与PostSharp的东西吗?

c# .net dependency-injection postsharp
1个回答
16
投票

我不认为你在这里失去了什么,限制确实是使用编译时编织的结果。

虽然我觉得编译时编织工具有它在软件开发的地方,我觉得自己是经常被滥用。我经常看到他们被用来修补在应用设计上的缺陷。在我建立的应用我申请的通用接口,以一定的建筑概念。举例来说,我定义:

  • 一个ICommandHandler<TCommand>接口,用于实现某一特定用途的情况下,服务;
  • 一个IQueryHandler<TQuery, TResult>接口,用于执行一个查询服务;
  • 一个IRepository<TEntity>接口作为抽象超过存储库;
  • 一个IValidator<TCommand>接口,用于执行消息验证部件;
  • 等等等等。

这使我能够创造这样的组文物的一个通用的装饰(例如,允许运行在自己的事务每个用例的TransactionCommandHandlerDecorator<TCommand>)。使用装饰有许多优点,如:

  • 这些通用的装饰是完全不可知的工具,因为有一个代码编织工具或拦截库中没有引用。 PostSharp方面完全依赖于PostSharp,和拦截器始终采取拦截框架,比如Castle.DynamicProxy依赖。
  • 由于装饰仅仅是一个正常的组成部分,可以依赖注入的构造函数,当你使用依赖注入撰写对象图,他们可以发挥正常的作用。
  • 该装饰代码是非常干净的,因为缺乏相关性与任何第三方工具。
  • 因为他们是工具无关,并允许依赖注入,装饰,可以很容易地单位,而不必恢复到特殊的技巧测试。
  • 要施加需要横切关注的应用代码可以很好地在隔离容易地测试,因为装饰不会在编译时编织英寸当装饰在编译时编织的,你总是被迫做的应用程序代码测试的集成式的,或需要恢复到特别打造的招数,以防止他们在你的单元测试项目中应用。
  • 装饰可以在运行时动态地,有条件地适用,因为没有编译时的代码编织回事。
  • 性能比用代码编织相同(甚至更快),因为没有反射物体施工期间回事。
  • 没有必要用的属性标记您的组件需要注意的一些方面必须应用。这样可以使你的应用程序代码的自由的这种横切关注点的任何知识,并使其更容易更换此。

很多人都写了这种应用设计;下面是我自己写的几篇文章:

UPDATE

装饰是伟大的,但我喜欢AOP是它的建议的概念和连接点。有没有一种方法来模拟与装饰相同的能力?我只能想到反射的现在。

一个连接点是一个“其中一个问题是要附加一个类中明确定义的位置”。当您使用的装饰应用AOP,你会被“限制”的加盟是对法的边界点。然而,如果你坚持SRPOCPISP,你会有很瘦的接口(通常是用单一的方法)。如果这样做,你会发现,几乎没有以往任何时候都具有类中的任何其他地方的一个连接点的理由。

一个建议是“关注,这将潜在地改变目标方法的输入和/或输出”。当装饰和基于消息的设计(我在这里推广的东西)工作,您的咨询需要更改消息(或替换更改后的值完整消息)或更改输出值。事情并不比代码那么多不同的织如果你申请的咨询,必须有建议适用于所有的代码之间的共同之处。

© www.soinside.com 2019 - 2024. All rights reserved.