将DIY依赖注入与面向方面编程相结合
本文关键字:方面 编程 相结合 DIY 依赖 注入 | 更新日期: 2023-09-27 18:25:59
对于即将到来的项目,我计划同时使用依赖注入和面向方面编程。我将自己实现前者,遵循DIY依赖注入指南,并使用LOOM.Net进行AOP部分。
创建交织类型的逻辑类和方面类的常见模式是
AspectClass aspect = new AspectClass();
LogicClass logic = Weaver.Create<LogicClass>(aspect);
我的直觉是在粘合代码中执行交织,例如,对于实现ILogicA
的类ConcreteLogicA
,这取决于ConcreteLogicB
实现的ILogicB
class MyInjector
{
...
public ILogicA GetLogicA(AspectClass aspectToInterweave)
{
return Weaver.Create<ConcreteLogicA>(aspectToInterweave, GetLogicB(aspectToInterweave));
}
public ILogicB GetLogicB(AspectClass aspectToInterweave)
{
return Weaver.Create<ConcreteLogicB>(aspectToInterweave);
}
...
}
这是一个可行的解决方案,还是偏离了轨道。优点是,我不必将我的逻辑与方面混合在一起(诚然,这是AOP的一种线索),但通过这种方式,我在粘合代码中添加了更多的逻辑。
既然您正在启动一个新项目,我建议您更仔细地研究SOLID软件设计原则,并尝试将其应用于您的新项目。当您使用正确的抽象并遵循SOLID原则设计应用程序时,几乎没有理由使用LOOM和PostSharp等代码编织工具。如果您已经处于无法轻易更改的遗留代码库的不幸境地,那么这些工具尤其有价值。
与其使用代码编织,不如让应用程序的设计来引导您。当您使用正确的抽象设计应用程序时,使用decorator可以很容易地添加交叉关注点。你可以在这里和这里找到使用适当抽象设计的系统的例子。
这些文章描述了如何使用decorator定义交叉关注点。当您以这种方式设计系统时,您可以将交叉关注点的实现与代码的其余部分分开进行测试。这在使用代码编织工具时要困难得多。当使用正确的抽象时,这将很容易。
在过去的几年里,我咨询了几家公司,在那里我教开发人员如何正确应用设计模式,以提高灵活性和可维护性。他们的遗留代码库很难实现,但你似乎很幸运,可以启动一个新项目。
利用这个机会来提高您的设计技能,并使您的应用程序在未来几年保持可维护性。
我认为您的问题可以通过使用支持动态拦截的依赖注入容器来解决(大多数都支持)。这个存储库演示了将现有代码向方面重构的过程。它使用温莎城堡DI容器。用动态拦截而不是IL Wiving实现方面的优势在于,您可以轻松地将依赖项注入到方面中,并且不需要依赖任何环境上下文/服务定位器。