Domanda :
Vorrei impostare il mapping delle dipendenze da un file * .config da un progetto che non ha riferimenti al progetto che contiene la classe concreta.
Scenario :
Userò termini da C #, Microsoft Unity e Visual Studio: ho un livello di presentazione con un progetto di servizio web e un progetto winform, un livello infrastruttura che comunica con gli archivi e c'è un livello logico di core business che definisce interfacce che l'infrastruttura deve implementare.
Progetti :
Presentazione :
DIApplication.WebServices - fa riferimento ai progetti Core + DependencyResolution
DIApplication.Winform - fa riferimento ai progetti Core + DependencyResolution
Infrastrutture :
DIApplication.Data - Comunica con repository, fa riferimento al Core
DIApplication.DependencyResolution - Registra le dipendenze dai progetti Core a Data. Questi sono gli unici due progetti a cui fa riferimento
Nucleo :
DIApplication.Core - Definisce le interfacce, non fa riferimento a nulla
Esempio :
Per un esempio, dirò che ho l'interfaccia DIApplication.Core.IRepository e la classe DIApplication.Data.RepositoryA e la classe DIApplication.Data.RepositoryB.
Va bene dire che il progetto DependencyResolution registrerà le dipendenze:
//If Application == WebService
container.RegisterType<IRepository , RepositoryA >();
//Else
container.RegisterType<IRepository , RepositoryB >();
Ma quello che mi piacerebbe fare è che Webservices Web.config mappa IRepository to RepositoryA, mentre l'app Winforms.config IRepository to RepositoryB
Webservices:
< register type="DIApplication.Core.IRepository, DIApplication.Core" mapTo=" DIApplication.Data.RepositoryA, DIApplication.Data" />
WinForms:
< register type="DIApplication.Core.IRepository, DIApplication.Core" mapTo=" DIApplication.Data.RepositoryB, DIApplication.Data" />
Il problema (credo) è che né DIapplication.Webservices o Winforms conoscono DIapplication.Data, quindi si interrompe sulla parte finale di questa chiamata in DIApplication.DependencyResolution:
IUnityContainer container = new UnityContainer(); UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); section.Configure(container);
Con l'errore:
The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
C'è un modo per aggirare questo problema senza dover includere un riferimento a DIApplication.Data all'interno di DIApplication.Webservices e Winforms?
Forse lo sto guardando nel modo sbagliato. So che rompe la nozione di separazione delle preoccupazioni, in cui il livello di presentazione non dovrebbe sapere né preoccuparsi di come i dati vengano conservati nei repository, solo che lo è. Ma voglio anche guidare le dipendenze sulla base del progetto in esecuzione.