合并ASP.NET MVC控制器依赖项(StructureMap)

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是由控制器谁做的空间需要的东西,并且IServiceOneIServiceTwo只在某些情况下需要.

我想看到这样的事情:

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是有意义的.这涉及识别相关服务的自然集群,因此具体如何完成这是针对每个代码库.