我目前正在创建一个小型个人Windows(桌面).NET LOB应用程序,我希望利用这个机会增加我对DI的知识和经验。我已将我的应用程序分为模型,DAO和GUI部分,但我想知道如何实现一些跨领域的概念,例如:
目前,我可以想出几种方法来提供这些信息:
我目前正倾向于使用ServiceLocator,因为我以前使用它并且工作得非常好。但是我担心失控。只需触及服务定位器而不是尝试修复设计问题就很容易了。
有人可以提供他们的经验/知识吗?
答案 0 :(得分:2)
听起来像aspect-oriented方法开始的完美案例。您的应用程序的LOB将根据业务功能要求进行设计,这些要求已经被交叉使用,具有不同的非功能性要求:身份验证,审计,日志记录等。
同时,dependency-injection可以解决部分当前应用程序要求。首先,我建议先确定composition root。例如,在wpf应用程序中,它是Application.OnStartup
方法。如果您能够识别组合根,最好避免使用service-locator。 服务定位器将在维护和测试时添加不必要的复杂性,因为它可以解决任何问题,因此依赖管理将变得复杂。
下一步,决定:依赖注入和面向方面的方法应该分开或组合。这两种方法都有其优点和缺点。
在选择分离方法时,您可以使用postsharp并获得很多好处:优秀的示例和文档,社区和随时可用的方面。但没有什么是免费的, postsharp 在免费版本中只有有限数量的功能,并且与continues-integration进行了复杂的集成。
另一种解决方案:将dependency-injection与dynamic-proxy结合使用。只要您遵循概念:程序到界面,而不是实现 - 您将实现所有要求。优点:一个地方可以连接所有组件。有两个主要缺点:第一个动态代理本身非常有限,第二个 - 依赖注入容器和动态代理之间的集成 - 对于某些容器而言已存在,其他人则不存在。示例:Ninject extension Interception,或StructureMap和Interception。
我建议您自己查看以下资源以找到更多答案: *预订AOP in .NET: Practical Aspect-Oriented Programming by Matthew D. Groves:第一章免费提供 *预订Dependency Injection in .NET by Mark Seemann:关于依赖注入的精心编写的书,以及专门用于拦截的第9章,我发现这种方法在你所描述的案例中非常有用。该书的作者还有an excellent blog dedicated to dependency injection和关于aspect-oriented programming with dependency Injection的视频。