RPM*_*984 8 c# asp.net-mvc dependency-injection dependency-management
我正在看我网站上的控制器,他们的大多数构造器看起来像这样:
public SomeController(
IServiceOne serviceOne,
IServiceTwo serviceTwo,
ILoggingService loggingService,
IGeospatialService geoSpatialService)
{
// copy to class variables.
}
Run Code Online (Sandbox Code Playgroud)
换句话说,它非常多毛,使重构变得困难.一些控制器有大约8个依赖项.
有什么办法可以将这些依赖关系"分组"到一个或多个桶中吗?
例如,ILoggingService
在每个控制器是必需的,IGeospatialService
是由控制器谁做的空间需要的东西,并且IServiceOne
和IServiceTwo
只在某些情况下需要.
我想看到这样的事情:
public SomeController(
ICoreServicesGroup coreGroup,
ISomeNameForServicesGroup serviceGroup)
{
// copy to class variables.
}
Run Code Online (Sandbox Code Playgroud)
我认为引入一些OO技术会很好,例如拥有一个"基础"依赖类,它需要一个ILoggingService
受保护的ctor.然后你可能有另一个继承的子依赖,等等.
有没有人这样做过?这是StructureMap可以为我做的事情,还是仅仅是我自己编写基本代码?
Mar*_*ann 13
记录
当每个控制器都需要一个依赖关系时,它是一个非常确定的指标,它不是一个"正常"的依赖,而是一个跨领域的关注.伐木是跨领域关注的典型例子,因此ILoggingService
应该像任何其他跨领域关注一样处理.
在SOLID OO中,解决跨领域问题的适当方法是使用装饰器(可以推广到AOP).但是,ASP.NET MVC Controller操作方法不是任何接口的一部分,因此这是一个不太理想的解决方案.
相反,MVC框架为拦截目的提供了动作过滤器.如果您想实现一个松散耦合的过滤器,请帮自己一个忙,并将其实现为全局过滤器而不是属性.
其他依赖项
对于其他依赖项,将它们重构为Facade Services是有意义的.这涉及识别相关服务的自然集群,因此具体如何完成这是针对每个代码库.