2010-03-19 38 views
4

几个月前,我发现了PostSharp,一段时间后,它很好。Spring.Net可以作为PostSharp吗?

但随后法律回来,回答说他们不喜欢旧版本的许可证。然后,该部门告诉我,2.0的价格高得令人无法接受(我们需要的座位数量)......我非常失望,但并没有灰心。我想,不能是唯一的这样的框架。

我一直在寻找替代品,但其中大部分都是死亡,维护不当(特别是在文档部门),学术用途,或所有上述(我在看你Aspect.Net)

然后我发现了Spring.Net,一段时间以来,它都很好。

我一直在阅读文档,并且继续描绘了AOP涅su似乎是一幅完美的图画。我不再锁定属性来标记要执行代码拦截的位置,但可以用XML配置,并且对其进行更改不需要重新编译。大。

然后我看了看样品,看到下面,在每一个使用场景:

// Create AOP proxy using Spring.NET IoC container. 
IApplicationContext ctx = ContextRegistry.GetContext(); 
ICommand command = (ICommand)ctx["myServiceCommand"];  
command.Execute(); 
if (command.IsUndoCapable) 
{ 
    command.UnExecute(); 
} 

为什么必须的代码的前两行存在吗?它毁了一切。这意味着我不能简单地向用户提供一组方面,属性或XML配置,通过在合适的方法/类/ etc中粘贴适当的属性或者编辑XML中的匹配模式,可以使用它们。他们必须修改他们的程序逻辑才能使其工作!

有没有办法让Spring.Net在这种情况下表现为PostSharp? (即用户只需要添加属性/ XML配置,而不是编辑任何方法的内容。

另外,是否有一个值得的功能替代PostSharp?我见过这样的问题标题如此,但没有他们只是想替换PostSharp,他们只是想补充它的功能,我需要完全替换。

+0

简短的回答是否定的,因为PostSharp实际上会将您的代码重写为构建后步骤。尽管如此,我会让春季专家权衡一下。我知道如果你使用DI来实例化你的服务并且愿意涉足方法拦截,你会变得非常接近。 – Aaronaught 2010-03-19 22:26:02

+0

地狱,我要重写!我甚至可以自己做需要的事情。如果只有CCI-AST被证明是足够好的,或者至少它的示例代码是功能强大且足够多样化的> _>还有什么可以满足我的需求吗? – 2010-03-19 22:30:17

+0

也许你可以更具体地了解你想要做什么以及你在哪里找到这个例子?我在Spring上没有太多,正如我已经提到过的,但是我曾经评估过一次,并且不记得必须在类中嵌入任何'ICommand'东西来使用Advice系统。 – Aaronaught 2010-03-19 22:43:20

回答

9

简而言之,是的,Spring.Net AOP可以按照您使用基于XML的配置描述的方式工作:您可以不必使用那些最初的两行代码,实际上基于代码的配置是不鼓励的,你可以使用基于XML的配置来配置Spring.Net AOP,这实际上是推荐的方法。有几个步骤是:

  1. 创建您的建议:BeforeAdvice,AroundAdvice,AfterReturningAdvice和ThrowsAdvice是建议的支持的类型。 AroundAdvice使用AOPAlliance接口,其他使用Spring.AOP接口。
  2. 定义你的切入点
  3. 应用切入点和建议

示例配置(从现场配置广义):在运行时进行

<!-- START Spring.Net AOP --> 

    <object id="beforeAdvice" type="MyBeforeAdvice, MyAOP"></object> 
    <object id="beforeAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop"> 
    <property name="Advice" ref="beforeAdvice" /> 
    </object> 

    <object id="returnsAdvice" type="MyAfterReturningAdvice, MyAOP"></object> 
    <object id="returnsAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop"> 
    <property name="Advice" ref="returnsAdvice" /> 
    </object> 

    <object id="throwsAdvice" type="MyThrowsAdvice, MyAOP"></object> 
    <object id="throwsAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop"> 
    <property name="Advice" ref="throwsAdvice" /> 
    </object> 


    <!-- Advise objects --> 
    <object type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop"> 
    <property name="ObjectNames"> 
     <list> 
     <value>*Command</value> 
     <value>...</value> 
     </list> 
    </property> 
    <property name="InterceptorNames"> 
     <list> 
     <value>beforeAdvisor</value> 
     <value>returnsAdvisor</value> 
     <value>throwsAdvisor</value> 
     </list> 
    </property> 
    </object> 


    <!-- END Spring.Net AOP --> 

织造,是非常快和非侵入。

希望这是使用的,

安德鲁

+0

博客文章简要介绍了AOP:http://andrewlocatelliwoodcock.com/2011/05/02/brief-介绍到AOP / – Alfamale 2011-05-10 10:00:02

2

我认为你正在寻找的lookup-method injection功能。

您已经在开始的某处加载了Spring.NET应用程序上下文。 Spring.NET基于代码的依赖性很小。问题是,你处处需要一个(谏)服务,则显式依赖Spring.NET与ContextRegistry.GetContext()..

您可以解决与使用查找法方法替代,例如:

创建AbstractCommandFactory:

namespace MyNamespace { 
    public abstract class AbstractCommandFactory : ICommandFactory { 
    public abstract ICommand getMyCommand(); 
    } 
} 

使用Spring.NET您可以getMyCommand返回Spring.NET对象:

<objects> 
    <object id="commandfactory" 
      type="MyNamespace.AbstractCommandFactory, MyAssembly"> 
    <lookup-method name="getMyCommand" object="commands.mycommand" /> 
    </object> 

    <object id="commands.mycommand" 
      type=MyNamespace.MyCommandImplementation, MyAssembly" /> 
</objects> 

现在,当您初始化Spring.NET应用程序上下文时,加载此命令工厂并一起传递引用。当你需要MyCommandImplementation的一个实例,你只要求一个从工厂实例:

public void doSomeWork() { 
    // factory is an ICommandFactory 
    // instantiated earlier using the explicit context.getObject("commandfactory") 
    ICommand myCommand = this.factory.getMyCommand(); 
    myCommand.Execute(); 
} 

现在你对Spring.NET显式依赖是很小的:只有在你的工厂的初始加载+实例。其余的代码保持干净。

奖励要点:您可以更轻松地创建ICommandFactory/ICommand模块来单元测试您的代码。

相关问题