如何减少控制器上注入的依赖项数量

Fac*_*tio 7 dependency-injection asp.net-mvc-3 simple-injector entity-framework-4.3.1

我正在使用MVC3,Entity Framework v4.3 Code First和SimpleInjector.我有几个简单的类看起来像这样:

public class SomeThing
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有另一个看起来像这样的实体:

public class MainClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual AThing AThingy { get; set; }
    public virtual BThing BThingy { get; set; }
    public virtual CThing CThingy { get; set; }
    public virtual DThing DThingy { get; set; }
    public virtual EThing EThingy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

每个Thingy(当前)都有自己的Manager类,如下所示:

public class SomeThingManager
{
    private readonly IMyRepository<SomeThing> MyRepository;

    public SomeThingManager(IMyRepository<SomeThing> myRepository)
    {
        MyRepository = myRepository;
    }
} 
Run Code Online (Sandbox Code Playgroud)

我的MainController因此如下:

public class MainController
{
    private readonly IMainManager MainManager;
    private readonly IAThingManager AThingManager;
    private readonly IBThingManager BThingManager;
    private readonly ICThingManager CThingManager;
    private readonly IDThingManager DThingManager;
    private readonly IEThingManager EThingManager;

    public MainController(IMainManager mainManager, IAThingManager aThingManager, IBThingManager bThingManager, ICThingManager cThingManager, IDThingManager dThingManager, IEThingManager eThingManager)
    {
        MainManager = mainManager;
        AThingManager = aThingManager;
        BThingManager = bThingManager;
        CThingManager = cThingManager;
        DThingManager = dThingManager;
        EThingManager = eThingManager;
    }

    ...various ActionMethods...
}
Run Code Online (Sandbox Code Playgroud)

实际上,此控制器中注入的依赖项数量是其两倍.它闻起来臭臭的.当你也知道有一个具有全部或大部分相同依赖关系的OtherController时,气味会更糟.我想重构它.

我已经足够了解DI知道属性注入和服务定位器不是好主意.

我无法拆分我的MainController,因为它是一个单一的屏幕,只需单击一个Save按钮就可以显示和编辑所有这些内容.换句话说,一个post post方法可以保存所有内容(尽管如果它有意义,我可以更改它,只要它仍然是一个Save按钮).这个屏幕是使用Knockoutjs构建的,如果有所不同,可以使用Ajax帖子进行保存.

我对环境语境的使用感到惋惜,但我并不认为这是正确的方法.我也很乐意使用注入Facade.我也想知道我是否应该在此时实现Command架构.(难道上面的所有这些都不会把气味移到其他地方吗?)

最后,也许独立于上述三种方法,我是否应该使用像GetAThings(),GetAThing(id),GetBThings(),GetBThing(id)等显式方法的LookupManager.(但是那个LookupManager需要注入几个存储库,或者一个新类型的存储库.)

抛开我的想法,我的问题是,重申:重构这些代码以减少注入依赖项的疯狂数量的好方法是什么?

Ste*_*ven 4

使用命令架构是一个好主意,因为这会将所有业务逻辑移出控制器,并允许您添加横切关注点而无需更改代码。但是,这并不能解决构造函数过度注入的问题。标准解决方案是将相关依赖项移至聚合服务中。然而,我确实同意马克的观点,即你应该看看工作单元模式