4

对于即将到来的项目,我计划同时使用依赖注入和面向方面的编程。我将自己实现前者,遵循DIY 依赖注入指南并使用LOOM.Net作为 AOP 部分。

创建逻辑类和方面类的交织类型的常见模式是

AspectClass aspect = new AspectClass();
LogicClass logic = Weaver.Create<LogicClass>(aspect);

我的直觉是在胶水代码中执行交织,例如对于实现的类ConcreteLogicAILogicA这取决于ILogicB实现ConcreteLogicB

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 的线索),但这样我在胶水代码中添加了更多逻辑。

4

2 回答 2

4

由于您正在开始一个新项目,我建议您更仔细地研究SOLID软件设计原则,并尝试将它们应用到您的新项目中。当您使用正确的抽象并符合 SOLID 原则来设计应用程序时,几乎没有理由使用 LOOM 和 PostSharp 等代码编织工具。如果您已经不幸地拥有无法轻易更改的遗留代码库,那么这些工具尤其有价值。

不要使用代码编织,而是让应用程序的设计引领您。当您使用正确的抽象设计应用程序时,使用装饰器添加横切关注点会很容易。您可以在此处此处找到使用适当抽象设计的系统示例。

这些文章描述了如何使用装饰器定义横切关注点。当您以这种方式设计系统时,您可以将横切关注点的实现与其余代码分开测试。使用代码编织工具时要困难得多。当使用正确的抽象时,这将很容易。

在过去的几年里,我咨询了几家公司,在那里我教开发人员如何正确应用设计模式,从而提高灵活性和可维护性。他们的遗留代码库很难实现,但你似乎很幸运,你开始了一个新项目。

以此为契机,提高您的设计技能,并让您的应用程序在未来几年内保持可维护性。

于 2014-10-09T10:13:51.187 回答
0

我认为您的问题可以通过使用支持动态拦截的依赖注入容器来解决(大多数都这样做)。存储库演示了将现有代码重构为方面的过程。它使用 Castle Windsor DI 容器。使用动态拦截而不是 IL Weaving 实现方面的优势在于,您可以轻松地将依赖项注入到方面,并且不需要依赖任何环境上下文/服务定位器。

于 2015-09-10T11:12:12.457 回答