sperimentare lavorando

di Marco Leoncini, in asp.net,

la possibilità di lavorare a progetti non molto complessi dal punto di vista dell'architettura, mi da il tempo di "sperimentare? alcune ?cosette?, che di riflesso complicano l'architettura e rendono il progetto più interessante
ma andiamo con ordine.
attualmente sto sviluppando un progetto utilizzando, alcune librerie di terze parti,
non ostante avessimo concordato insieme, una serie di interfacce da adottare , per lo sviluppo dell?applicazione, alla fine ho deciso di incapsulare la loro libreria in un mio assembly e successivamente caricarlo da codice.
Stimolato da un articolo su MSDN o sostituito il mio vecchio ciclo alla ricerca dei tipi e mi sono mosso così:
ho creato in interfaccia che definisce un'unica proprietà:

public interface IDalWrapperAttribute
{
string Name{get;}
}

successivamente creo un attributo che implementa tale interfaccia

[AttributeUsage(AttributeTargets.Assembly)]
public class ConnectionDalAttribute : System.Attribute, IDalWrapperAttribute 
{
private readonly string name;
public ConnectionDalAttribute(string name)
{
this.name = name;
}
#region Membri di IDalWrapperAttribute
public string Name
{
get
{
return this.name;
}
}
#endregion
}

così da decorare l?assembly così:

[assembly: ConnectionDalAttribute("StrData.ConnectionDalWrapper")]
namespace StrData
{??.}

il passo successivo è stato costruirsi una classe che automatizzasse il caricamento dell?assembly e la creazione degli oggetti.

public sealed class RetriveClassHelper
{
string assemblyPath;
private RetriveClassHelper()
{}
public RetriveClassHelper(string assemblyPath)
{
this.AssemblyPath = assemblyPath;
}
public object GetClassIstance(InterfaceType interfaceType)
{
object returnObj = null;
try
{
Assembly asm = Assembly.LoadFrom( AssemblyPath );
Type t = this.GetInterfaceAttributeType( interfaceType );
IDalWrapperAttribute iDalWrapperAttribute = ( IDalWrapperAttribute )asm.GetCustomAttributes( t, false )[0];
returnObj = Activator.CreateInstance( asm.GetType( iDalWrapperAttribute.Name ) );
}
catch
{
throw new ApplicationException("Si è verificato un problema durante la creazione dell'istanza della classe" );
}
return returnObj;
}
public string AssemblyPath
{
get
{
return this.assemblyPath;
}
set
{
if(value == string.Empty)
{
throw new ArgumentException("Il percorso non può essere nullo","value");
}
assemblyPath = HttpContext.Current.Server.MapPath(value);
}
}
private Type GetInterfaceAttributeType(InterfaceType interfaceType)
{
Type t = null;
switch ( interfaceType )
{
case InterfaceType.IConnectionDalWrapper:
t = typeof( ConnectionDalAttribute );
break;
}
if(t == null)
{
throw new ArgumentException("impossibile trovare l'interfaccia specificata","interfaceType");
}
return t;
}
}

al costruttore viene passato il percorso dell?assembly, successivamente il metodo GetClassIstance, carica l?assembly, recupera il tipo di attributo da cercare con Type t = this.GetInterfaceAttributeType( interfaceType ); una volta recuperato, tramite il reference all?iterfaccia richiamo la proprietà Name che restituisce il nome completo della classe da istanziare,

returnObj = Activator.CreateInstance( asm.GetType( iDalWrapperAttribute.Name ) )

questo è lo scheletro che sto sviluppando in modo da tenere separati due progetti che potrebbero in futuro prendere strade differenti.

Adesso inizia un po? di pulizia del codice

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese