Sto utilizzando MVC3, Entity Framework v4.3 Code First e SimpleInjector. Ho diversi semplici classi che assomigliano a questo:Come ridurre il numero di dipendenze iniettate sul controller
public class SomeThing
{
public int Id { get; set; }
public string Name { get; set; }
}
ho un altro soggetto che assomiglia a questo:
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; }
}
Ogni Thingy (attualmente) ha la propria classe Manager, in questo modo:
public class SomeThingManager
{
private readonly IMyRepository<SomeThing> MyRepository;
public SomeThingManager(IMyRepository<SomeThing> myRepository)
{
MyRepository = myRepository;
}
}
mio MainController segue di conseguenza:
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...
}
In realtà, ci sono il doppio delle dipendenze iniettate in questo controller. Puzza. L'odore è peggiore quando sai anche che esiste un OtherController con tutte o quasi le stesse dipendenze. Voglio refactoring.
So già abbastanza su DI per sapere che l'iniezione di proprietà e il localizzatore di servizi non sono buone idee.
Non riesco a dividere il mio MainController, perché è una singola schermata che richiede che tutte queste cose siano visualizzate e modificabili con il clic di un singolo pulsante Salva. In altre parole, un singolo metodo di post-azione salva tutto (anche se sono disposto a cambiarlo se ha senso, purché sia ancora un singolo pulsante Salva). Questa schermata è costruita con Knockoutjs e salva con i post Ajax se questo fa la differenza.
Mi rallegro dell'uso di un ambiente ambient, ma non sono sicuro che sia la strada giusta da percorrere. Ho anche incoraggiato l'uso di iniettare una facciata. Mi chiedo anche se dovrei implementare un'architettura di comando a questo punto. (Non è possibile spostare l'odore da qualche altra parte?)
Infine, e forse indipendente dai tre approcci precedenti, dovrei invece avere un singolo, per esempio, LookupManager con metodi espliciti come GetAThings() , GetAThing (id), GetBThings(), GetBThing (id) e così via? (Ma poi quel LookupManager avrebbe bisogno di diversi repository iniettati, o un nuovo tipo di repository.)
Le mie riflessioni a parte, la mia domanda è, per ribadire: qual è un buon modo per refactoring questo codice per ridurre il numero pazzo di dipendenze iniettate?
possibile duplicato di [Come gestire l'over-injection del costruttore in .NET] (http://stackoverflow.com/questions/4603555/how-to-deal-with-constructor-over-in-injection-in-net) – Steven