我正在查看我网站中的控制器,它们的大多数构造函数如下所示:
public SomeController(
IServiceOne serviceOne,
IServiceTwo serviceTwo,
ILoggingService loggingService,
IGeospatialService geoSpatialService)
{
// copy to class variables.
}
换句话说,它非常繁琐并且使得重构变得困难。一些控制器有大约 8 个依赖项。
有什么方法可以以某种方式将这些依赖项“分组”到多个存储桶之一中吗?
例如,ILoggingService
每个控制器都需要,IGeospatialService
进行空间操作的控制器需要,并且IServiceOne
and IServiceTwo
仅在某些情况下需要。
我希望看到这样的东西:
public SomeController(
ICoreServicesGroup coreGroup,
ISomeNameForServicesGroup serviceGroup)
{
// copy to class variables.
}
我认为引入一些 OF 技术会很好,例如拥有一个“基”依赖类,它需要ILoggingService
在它的受保护的ctor中。那么你可能有另一个继承的子依赖项,等等。
以前有人这样做过吗?这是 StructureMap 可以为我做的事情,还是只是我滚动自己的基本代码?
Logging
当需要依赖时每一个控制器这是一个非常确定的指标,表明它不是“正常”依赖项,而是一个跨领域关注。日志记录是横切关注点的典型示例,因此ILoggingService
应像任何其他跨领域关注点一样处理。
In SOLID http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29OO 解决跨领域问题的适当方法是采用装饰者 http://en.wikipedia.org/wiki/Decorator_pattern (which 可以推广到AOP http://blog.ploeh.dk/2010/09/20/InstrumentationWithDecoratorsAndInterceptors.aspx)。但是,ASP.NET MVC 控制器操作方法不是任何接口的一部分,因此这是一个不太理想的解决方案。
相反,MVC 框架提供了动作过滤器 http://msdn.microsoft.com/en-us/library/system.web.mvc.iactionfilter.aspx出于拦截目的。如果你想实现一个松散耦合的过滤器,帮自己一个忙,将其实现为全局过滤器而不是属性 https://stackoverflow.com/a/7194467/126014.
其他依赖项
对于其他依赖项,这是有意义的将它们重构为 Facade Services https://stackoverflow.com/questions/6025482/strategy-to-refactor-when-too-many-dependencies-injected-into-service-or-control/6026515#6026515。这涉及识别相关服务的自然集群,因此具体如何完成取决于每个代码库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)