La tua domanda non è chiara in quanto non è ovvio che cosa succede con quegli oggetti Class1
e Class2
. Ma supponendo che vengano usati, condividono un'interfaccia? Altrimenti, stai rendendo la vita dura per DI.
Quello a cui dovresti mirare è una fabbrica che implementa essa stessa un'interfaccia. Quindi si inserisce un'istanza di tale interfaccia di fabbrica nel costruttore. A sua volta, la factory avrà un metodo che restituisce un'istanza dell'interfaccia che Class1
e Class2
implementano.
L'istruzione switch si trova quindi in un'implementazione concreta dell'interfaccia factory.
Modifica
Alla luce di voi, commentate che viene usata un'interfaccia condivisa, come funzionerebbe secondo le seguenti linee. Supponiamo che tu abbia attualmente la classe Foo
:
class Foo
{
void Bar(int i)
{
switch(i)
{
case 1: DoSomethingWith(new Class1());break;
case 2: DoSomethingWith(new Class2());break;
}
}
private void DoSomethingWith(ISomeThing x) ...
}
Quindi usando DI, questo potrebbe diventare qualcosa del tipo:
class Foo
{
private readonly ISomethingFactory _factory;
public Foo(ISomeThingFactory factory) => _factory = factory;
void Bar(int i) => DoSomethingWith(_factory.CreateObject(i));
private void DoSomethingWith(ISomeThing x) ...
}
interface ISomethingFactory
{
ISomeThing CreateObject(int i);
}
class ConcreteFactory : ISomethingFactory
{
public ISomeThing CreateObject(int i)
{
switch(i)
{
case 1: return new Class1();
case 2: return new Class2();
}
}
}
...
var myFoo = new Foo(new ConcreteFactory());