Immagino tu abbia qualcosa di simile?
public class Main(string[] args)
{
string param = args[0]; //load parameter from config
Classifier c = new Classifier(param)
SomeClass x = new SomeClass(c);
var o = x.DoSomething();
}
public class SomeClass
{
OtherClass o;
//doesnt use the classifier but needs it for OtherClass,
//hence required for passing down the chain
public SomeClass(Classifier c)
{
o = new OtherClass(c);
}
public object DoSomething()
{
return o.DoSomthing();
}
}
public class OtherClass
{
public OtherClass(Classifier c) {} //uses classifier object 'far away'
public object DoSomething() {}
}
E vuoi evitare di far passare l'oggetto Classifier attraverso il costruttore della catena, o di avere oggetti che non sono la lettura vera e propria dell'applicazione direttamente dalla configurazione?
Il mio suggerimento in questi casi è che puoi fare una delle due cose
A: Controlla che il tuo "superiore nelle classi di catena" stia rispettando il principio della responsabilità unica. Sarebbe meglio chiamare semplicemente OtherObject?
B: puoi spostare il parametro iniettato come parametro della chiamata di funzione? in questo caso x.DoSomething (c);
Nella maggior parte dei casi penso che sia un odore di codice. Se il codice è troppo "profondo" in questo modo, è probabile che i tuoi oggetti non facciano più una sola cosa, ma orchestrino varie altre classi per fare più cose. Anche se uno strato di questo è buono, supponiamo tu abbia un servizio () che avvolge tutta la logica e viene quindi implementato in un'app, un sito Web, un servizio Windows, ecc. Quando inizi a suddividere quel servizio in un altro servizio, in un altro servizio Penso che sia il momento di fare un passo indietro e vedere se non puoi semplicemente istanziare i servizi di livello inferiore di cui hai bisogno direttamente e chiamarli in un livello