Sto ancora cercando di fare esperienza con DI. Consentitemi di illustrare la mia situazione e potete darmi dei consigli su se sto usando correttamente DI e Abstract Factory.
Ho bisogno di creare IModels in fase di runtime. Quindi userò la DI per iniettare una IModelFactory nei miei oggetti. Ma l'implementazione concreta dei miei IModel dipende da IDataManagers. Questo va bene, posso iniettare IDataManagerFactory nella mia implementazione di IModelFactory. Inoltre, poiché le implementazioni di IDataManager dipendono da IRepository. Posso iniettare IRepositoryFactory nell'implementazione di IDataManager.
Questo tipo di fabbrica astratta concatena il design accettabile? O è un avvertimento che sto percorrendo la strada sbagliata? Tutti gli esempi che vedo online sono fondamentalmente Fabbriche che creano oggetti con dipendenze dei parametri o del tutto assenti.
// Products
class Model : IModel
{
IDataManger dm;
ctor(IDataMangerFactory dmFactory)
{
dm = dmFactory.Create();
}
}
class DataManager : IDataManager
{
IRepository repo;
ctor(IRepositoryFactory repoFactory)
{
repo = repoFactory.Create();
}
}
class Repo : IRepository
{
ctor() {}
}
// Factories
class RepoFactory : IRepositoryFactory
{
public IRepository Create()
{
return new Repo();
}
}
class DmFactory : IDataManagerFactory
{
IRepositoryFactory repoFactory;
ctor(IRepositoryFactory factory)
{
repoFactory = factory;
}
public IDataManager Create()
{
return new DataManager(repoFactory);
}
}
class ModelFactory : IModelFactory
{
IDataManagerFactory dmFactory;
ctor(IDataManagerFactory factory)
{
dmFactory = factory;
}
public IModel Create()
{
return new Model(dmFactory);
}
}
// register the classes into the DI
// Application root instantiates Consumer. DI resolves.
// Consumer
class Consumer
{
public BindableCollectionOfModels {get;set;}
IModelFactory modelFactory;
ctor(IModelFactory factory)
{
modelFactory = factory;
}
public void UserClicksCreateNewModelInUI()
{
var model = modelFactory.Create();
BindableCollectionOfModels.Add(model);
}
}
Il mio istinto mi dice che questo può andare in entrambi i modi. Sto scrivendo un sacco di codice extra, aggiungendo complessità, ecc., E qualcosa non mi sembra giusto. D'altra parte, sto ottenendo la possibilità di scambiare le implementazioni lungo tutta la catena. Questo è positivo nel mio progetto perché siamo in una cornice temporale per ottenere prototipi di fronte al cliente, ma una volta che il cliente vede come funziona, abbiamo il tempo di implementare l'implementazione e perfezionarla. Quindi, usando questo metodo, possiamo semplicemente scambiare implementazioni disordinate e inefficienti con implementazioni accurate e raffinate mentre andiamo avanti con il progetto.
La mia domanda è: è un buon uso di Fabbriche astratte e DI o sto sbagliando? Se è così, perché? In caso contrario, spiega.