Il presente articolo è stato tradotto automaticamente.
Modelli e procedure
È possibile basa su Patterns and Practices
Alex Homer
Contenuto
Modelli e procedure
Un magazzino di Guida
Coping con Abstraction
Una cronologia Brief della relazione in Microsoft
Estendere l'utente corrente
Riepilogo
La scrittura di codice del computer utilizzato per essere estremamente difficile. Quando è iniziata più anni fa più occupa tenere presente che l'unico modo rendere un programma eseguito in più rispetto a quanto una ricerca per indicizzazione desultory per scrivere in codice macchina di programmazione di computer di casa. Anche un'utilità semplice elaborazione testi può solo dopo alcune settimane per creare i pianificato le allocazioni di memoria per le variabili, scritte routine per eseguire semplici operazioni quali caratteri disegno sullo schermo e della tastiera di decodifica di input e quindi digitato ogni istruzione processore singolo in un assembler.
Oggi, di confronto, creare codice potente è semplice. Articolo fornita per concesso ampia gamma di strumenti, linguaggi ad alto livello, i Framework di Common Language runtime, librerie di codice e servizi del sistema operativo che consentono di creare applicazioni in modo rapido ed efficiente. Durante la creazione il codice è invece diventato molto più semplice, l'attività di creazione di applicazioni ha non. Si prevede più da nostre applicazioni attuali garantiscono. Che devono comunicare su reti, interagire con altre applicazioni e servizi, esporre le interfacce utente altamente interattiva e reattiva e supportare Rich-Media e grafica. E, naturalmente, deve essere affidabile, protezione affidabile e gestibile.
Infatti, sarebbe praticamente impossibile soddisfare i requisiti pretesa di nostro applicazioni attuali senza continua crescita ed evoluzione di linguaggi di programmazione, sistemi operativi, servizi di piattaforma e Framework. L'aumento notevole complessità di queste applicazioni anche ha imposto per individuare i metodi per semplificare e organizzare il codice. Nel corso degli anni, diverse tecniche di programmazione e progettazione tentate e Testate è evoluto, ad esempio componentization, l'orientamento di oggetto, e, più di recente, l'orientamento del servizio.
Modelli e procedure
Mentre miglioramenti in strumenti e i framework rendere più semplice di scrivere codice più rapidamente e moderni linguaggi e programmazione gli stili semplificano la scrivere codice migliore, un'area che hanno l'impatto che la maggior parte della capacità di creare applicazioni l'ultimo 10-15 anni è stato l'evoluzione e accettazione crescente di modelli di progettazione software.
Modelli di progettazione descrivono problemi comuni che si verificano più volte nell'applicazione progettazione e sviluppo e forniscono le tecniche per la gestione di questi problemi. Modelli anche descrivono la procedura di settore corrente per la risoluzione dei problemi architetturali e per la gestione richiesto la complessità della progettazione di applicazioni. La disposizione di elementi di codice e la soluzione è il nucleo della progettazione software oggi e modelli di noi forniscono metodi per semplificare e organizzare gli elementi, fornendo l'migliore opportunità di ottimizzare le prestazioni, la flessibilità e gestibilità per le applicazioni.
Dal rilascio del libro interruzione riprogettata il gruppo quattro, Erich gamma, Richard Helm, Johnson Ralph e John M. Vlissides, modelli di struttura: Elements of Reusable Object-Oriented software (Addison-Wesley, 1996), che documentato numerose i modelli di progettazione di base che è eseguire per concesso oggi, a una velocità phenomenal ha raggiunto il numero di modelli di progettazione disponibili per gli sviluppatori e le finestre di progettazione. Quasi ogni aspetto della creazione di software è associati modelli di progettazione e implementazione e semplicemente documentare tutte le ha diventano un'attività Impossibile. Al contrario, progettisti e sviluppatori tendono a frammento in specialties e scopri i motivi più applicabili a propria area di competenza.
Un magazzino di Guida
In 2002, il gruppo di modelli e procedure presso Microsoft Corporation pubblicato l'architettura delle applicazioni per .NET: guida di progettazione di applicazioni e servizi, insieme portare l'avviso specialistiche e istruzioni di progettazione di base per progettisti di creare applicazioni di Microsoft .NET Framework. Tuttavia, le tecnologie modificare nel tempo e mentre gli aspetti fondamentali di progettazione e sviluppo descritti nella Guida sono altrettanto valido oggi, la Guida originale non descritte alcune delle nuove funzionalità di .NET Framework o risolvere i problemi di progettazione derivante per i nuovi tipi di applicazioni.
Per i mesi diversi ultimi, un ampio team di specialisti del settore ed esperti di materia, all'interno e all'esterno di Microsoft, è stato collaborare per creare una nuova edizione della Guida che fornisce un'introduzione completa alla tema dell'architettura dei scritti e la progettazione di soluzioni in Microsoft .NET Framework. La Guida all'architettura di Microsoft Application (seconda edizione) descrive principi architettura ad alto livello e modelli e riflessioni corrente sulle pratiche di progettazione e sviluppo accettati. Sono inoltre disponibili istruzioni sull'applicazione di questi fattori a tipi specifici di applicazioni e fornisce una panoramica ampia delle molti servizi di piattaforma e librerie di codice disponibili per facilitare l'implementazione.
Naturalmente, per chiedere una frase utilizzata spesso, Architettura software e di sistema è qualcosa che include la domanda di vita, Universo e tutti gli elementi. Nessuna singola pubblicazione possibile ogni domanda è possibile o auguriamo che consentono la copertura completamente completa di ogni scenario possibile. Tuttavia, la Guida mira a fornire le informazioni è necessario se appena iniziano da designing.NET applicazioni basate su Framework, un designer esperto lo spostamento di .NET Framework da un'altra piattaforma, un architetto svolta cercare informazioni specifiche e suggerimenti, o semplicemente interessato ulteriori sulle vasto di scenari e le opportunità offerte da .NET Framework.
Coping con Abstraction
Per illustrare le procedure del settore, la Guida Elenca principi generali che è necessario applicare durante la progettazione di quasi qualsiasi tipo di applicazione. Questi principi includono la gestione di separazione dei problemi, utilizzare astrazione per implementare debole associazione tra i livelli e i componenti, implementa le funzionalità di posizione del servizio e la gestione crosscutting problemi quali registrazione e protezione. Mentre questi può sembrare da obiettivi preferibile ma non correlati, una tecnica consentono applicare facilmente diversi principi di progettazione. Il principio di inversione dipendenza implica la separazione dei problemi mediante le astrazioni anziché implementazioni concrete. In termini di modelli di progettazione, è possibile ottenere questo applicando il modello di inversione del controllo (IoC) e il modello correlato, dipendenza Infiltrazione DI).
La teoria è abbastanza semplice. Invece di specificare il tipo concreto effettivo che ogni classe o il componente utilizzerà per eseguire alcune attività o un processo in fase di progettazione, è possibile disporre per queste classi o i componenti da recuperare l'oggetto appropriato da un contenitore che precedentemente configurato con mapping di tipo e registrati i tipi. Ad esempio, come illustrato nell'applicazione semplice nella Figura 1 , il componente di accesso ai dati può richiedere i servizi di un componente di registrazione. Come si è estratti correttamente il codice crosscutting dal codice specifico di attività e specifiche dell'applicazione, si dispone di diversi componenti di registrazione da cui scegliere. Ad esempio uno è progettato per l'utilizzo durante il debug dell'applicazione, un'altra per utilizzare quando l'esecuzione dell'applicazione internamente sulla rete, e una terza più adatto per l'esecuzione in un sistema a livello di organizzazione che utilizza un ambiente di monitoraggio, ad esempio Microsoft System Center.
Nella figura 1 un'applicazione semplice che di utilizzo di livelli e di un separato registrazione componenti
È possibile anche nel caso di avere più dati accesso ai componenti, ciascuno progettati per l'utilizzo in un ambiente specifico o con un diverso tipo di archivio dati. Di conseguenza, il livello business sarà necessario scegliere il componente del livello di dati appropriato in base la distribuzione corrente o di un ambiente di runtime. In modo analogo, potrebbe essere servizi che l'applicazione utilizza più volte, ad esempio un messaggio di posta elettronica invio servizio o un servizio di trasformazione di dati. Inserimento di dipendenza può fungere da una struttura di posizione servizio per consentire le applicazioni di recuperare un'istanza (una nuova istanza o un'istanza esistente) del servizio in fase di esecuzione.
Ciascuno di questi esempi in modo efficace descrive una dipendenza di una parte dell'applicazione su un altro e risolvere queste dipendenze in modo che non strettamente associa gli oggetti è scopo del principio di inversione di dipendenza.
Una cronologia Brief della relazione in Microsoft
Sebbene i principi di inversione di dipendenza stati intorno a per un lungo periodo di tempo, caratteristiche che consentono agli sviluppatori di implementarlo in applicazioni in esecuzione su alla piattaforma Microsoft sono relativamente recente. Infatti, vi è un brano che uno sviluppatore renowned nel mondo Java, quando si visita campus Microsoft, remarked che fede generale è che nessuno di Microsoft potrebbe scrivere "relazione Infiltrazione". Mentre, senza dubbio un myth urban è il caso che strumenti che consentono agli sviluppatori di implementare numerose criteri comuni non sono stati una priorità nella maggior parte delle aree della società.
Tuttavia, il gruppo di modelli e procedure presso Microsoft indica fuori a nostro posizione univoco del corso all'interno della società ma all'esterno del team di sviluppo di prodotto principale e divisioni. L'obiettivo di p e p, come illustrato per il sottotitolo "verifica le procedure per risultati prevedibili" è fornire agli sviluppatori, strumenti, librerie, framework e istruzioni un innumerevoli di altri strumenti di consentono di progettare e creare applicazioni migliori sulla piattaforma Microsoft. Una rapida panoramica al nostroHome page MSDNverrà illustrato l'ampia gamma di cespiti che forniamo.
Tra queste risorse sono diversi prodotti che utilizzare il modello di relazione Infiltrazione, inclusi Enterprise Library, Framework applicazione composito e software factory. Durante lo sviluppo di queste risorse, in particolare l'originale composito Application Block (CAB), è diventato chiaro che non è necessario un meccanismo di inserimento dipendenza riutilizzabile ed estremamente configurabile, e quindi il team creato la versione originale dell'oggetto generatore.
Oggetto generatore è quasi completamente configurabile e ora viene utilizzato in una vasta gamma di prodotti in p & p e all'interno di Microsoft. Tuttavia, è abbastanza difficile da utilizzare. Richiede una grande stati specificati parametri che accetta oggetti complessi e che espone un intervallo di eventi che è necessario gestire per applicare la configurazione che è necessario. Tentativi iniziali di documento generatore di oggetti come parte del progetto CAB mostrata prima che questa doveva essere un'attività uphill. Inoltre, oggetto generatore è invece più di un contenitore di inserimento delle dipendenze ed è sembrata eccessivo in termini dei requisiti più comuni per l'implementazione dei modelli DI e IoC.
Durante lo sviluppo di Enterprise Library 4.0 oggetto generatore è stato aggiornato, non per semplificare, ma per rendere più rapido ed efficace. Inoltre è stato ottimizzato per il meccanismo di inserimento primo dipendenza principali da Microsoft per cui è obiettivo squarely agli sviluppatori che desiderano implementare i modelli DI e IoC. Oggetto generatore è la base per unità, un contenitore di inserimento delle dipendenze leggero, flessibile che supporta intrusivi nel codice del costruttore, infiltrazione di proprietà e inserimento di chiamata di metodo.
Unità offre funzionalità per la creazione oggetti semplificato, soprattutto per oggetto gerarchico strutture e le dipendenze, astrazione dei requisiti in fase di esecuzione o tramite configurazione; semplificata la gestione di crosscutting problemi; e aumentata flessibilità di posticipo della configurazione del componente per il contenitore. Ha una capacità di posizione servizio e consente di client per memorizzare o memorizzare nella cache il contenitore, anche nelle applicazioni Web ASP.NET.
Dal rilascio della prima versione unità in anticipata 2008, ha rilevato una posizione iniziale in molti p & p cespiti come meccanismo di impostazione predefinita per l'implementazione inversione di dipendenza. Unità dispone inoltre continua evoluzione durante rimanente compatibile ed è possibile utilizzarla per attivare le funzionalità all'interno di Enterprise Library, nonché per utilizzarlo come un contenitore DI autonomo. Nella versione più recente, offre funzionalità per implementare istanza e intercettazione di tipo (mediante un'estensione di plug-in che consente le implementazioni di aspetto A programmazione tecniche quali criteri di inserimento.
Unità sono distribuiti anche altre implementazioni di contenitore DI cui obiettivo in attività specifiche e requisiti, ad esempio un'implementazione estremamente lightweight progettata per utilizzare in dispositivi mobili e telefoni smart. Nel frattempo, pianificati futuri sviluppi nei arena unità ed Enterprise Library includono funzionalità per aprire Enterprise Library per altri meccanismi di contenitore di terze parti, garantendo estensioni aggiuntive che attiva nuove funzionalità per unità. Applicazione di inversione di dipendenza
Lasciare questa cronologici vengano visualizzate e restituire l'ipotetica applicazione, come possibile applicare il principio di inversione di dipendenza per raggiungere obiettivi, illustrati in precedenza, di separazione di problemi, astrazione e accoppiamento separato? La risposta è per configurare un contenitore di inserimento delle dipendenze, ad esempio unità, con i tipi appropriati e digitare i mapping e consentire all'applicazione recuperare e inserire istanze di oggetti appropriati in fase di esecuzione. Nella figura 2 viene illustrato come utilizzare il blocco di applicazione di unità per implementare questo contenitore. In questo caso, è possibile popolare il contenitore con tipo di mapping tra definizioni di interfaccia dei componenti di dati e i componenti di registrazione e le implementazioni concrete specifiche di queste interfacce che si desidera che l'applicazione in modo da utilizzare.
Nella figura 2 dipendenza injection possibile selezionare i componenti appropriati in fase di esecuzione in base alla configurazione del contenitore.
In fase di esecuzione, il livello business esegue una query il contenitore per recuperare un'istanza del componente livello dei dati corretti, a seconda del relativo mapping corrente. Il livello dati esegue quindi una query il contenitore per ottenere un'istanza del componente registrazione appropriato, a seconda del mapping memorizzato per quel tipo di interfaccia. In alternativa, i dati e i componenti di registrazione possono ereditare dalle rispettive classi base e le registrazioni nel contenitore possono mappare tra questi tipi di base e i tipi concreti che erediti.
Questo approccio basato su contenitore per risolvere i tipi e le istanze significa che lo sviluppatore può essere modificato le implementazioni per i dati e i componenti di registrazione, purché queste implementazioni forniscono la funzionalità necessaria ed espongono l'interfaccia appropriata (ad esempio tramite implementa l'interfaccia mappato o ereditando dalla classe base mappata). La configurazione di contenitore può essere impostata nel codice in fase di esecuzione utilizzando metodi del contenitore che registra i tipi, mapping dei tipi o istanze esistenti di oggetti. In alternativa, è possibile popolare il contenitore caricando le registrazioni da un'origine della configurazione o un file, ad esempio il file web.config o un file app.config.
Quando si desidera registrare più di un'istanza di un tipo, è possibile utilizzare un nome per definire ogni e risolvere i diversi tipi, specificando il nome. La registrazione anche possibile specificare la durata dell'oggetto, consentendo di ottenere le funzionalità di stile di percorso del servizio registrando l'oggetto del servizio come un singleton o con una durata specifica, ad esempio al singolo thread. Nell'esempio di codice seguente viene illustrato alcuni esempi di registrazione di mapping dei tipi con il contenitore:
C#
// Register a mapping for the CustomerService class to the IMyService interface.
myContainer.RegisterType<IMyService, CustomerService>();
// Register the same mapping using a mapping name.
myContainer.RegisterType<IMyService, CustomerService>("Data");
// Register the first mapping, but as a singleton.
myContainer.RegisterType<IMyService, CustomerService>(
new ContainerControlledLifetimeManager());
Nota: gli esempi di codice I riferimento classi e tipi utilizzando solo il nome della classe. È possibile utilizzare le definizioni di alias del tipo del file di configurazione ai alias nomi completo del tipo di classi, che semplifica il contenitore di registrazione quando si utilizza un file di configurazione.
Per recuperare l'istanza di un oggetto, semplicemente query il contenitore specificando il tipo, il tipo di interfaccia o il tipo di classe base (e il nome,), se registrato il tipo utilizzando un nome come illustrato nell'esempio successivo. Il contenitore risolve il tipo, se è registrato, crea e restituisce un'istanza di oggetto appropriato. Se non è registrato, il contenitore semplicemente crea una nuova istanza di tale tipo e mani nuovamente. Perché è necessario risolvere elementi tramite il contenitore quando si verifica nessuna registrazione per tale tipo? L'idea è di sfruttare le funzionalità molto utile e aggiuntive unità e molti altri DI contenitore meccanismi, fornisce, ovvero la possibilità di inserire oggetti utilizzando il costruttore, impostazione di proprietà e inserimento di chiamata di metodo.
C#
// Retrieve an instance of the mapped IMyService concrete class.
IMyService result = myContainer.Resolve<IMyService>();
// Retrieve an instance by specifying the mapping name.
IMyService result = myContainer.Resolve<IMyService>("Data");
Ad esempio, quando si crea un'istanza di un oggetto tramite il contenitore, unità esamina i costruttori e verrà inserire automaticamente le istanze del tipo appropriato nei parametri del costruttore. Tornando alla precedente esempio semplice applicazione, componente di accesso ai dati potrebbe avere un costruttore che accetta un riferimento a un componente di registrazione come parametro. Se questo tipo di parametro è l'interfaccia o classe base per la registrazione dei componenti registrati con il contenitore, unità verranno risolvere il tipo di mapping, creare un'istanza e passare al costruttore del componente di dati (come illustrato nella Figura 3 ). Scopo nulla eccetto registro i mapping.
Nella figura 3 inserire oggetti in parametri di costruttore
C#
// In main or startup code:
// Register a mapping for a logging component to the ILogger interface.
// Alternatively, you can specify this mapping in a configuration file.
myContainer.RegisterType<ILogger, MyLogger>();
...
// In data access component:
// Variable to hold reference to logger.
private ILogger _logger = null;
// Class constructor. Unity will populate the ILogger type parameter.
public DataAccessRoutines(ILogger myLogger)
{
// store reference to logger
_logger = myLogger;
_logger.WriteToLog("Instantiated DataAccessRoutines component");
}
Questo significa che è possibile cambiare il tipo concreto effettivo utilizzato dall'applicazione sufficiente modificare la configurazione del contenitore, sia in fase di progettazione, in esegue tempo modificando la configurazione o in modo dinamico in base su alcuni valore codice raccoglie dall'ambiente e che utilizza per creare o aggiornare il mapping nel contenitore. È possibile collegare il componente di registrazione di debug quando è necessario o collegare un nuovo componente registrazione super veloce" quando si trova che quella precedente è troppo lenta. Nel frattempo, l'amministratore di sistema può aggiornare la configurazione come richiesto per monitorare, gestire e adattare il comportamento dell'applicazione in fase di esecuzione per ambienti di modifica seme e problemi operativi.
Allo stesso modo, se disponi di una relazione tra due oggetti, quali la dipendenza di una visualizzazione il moderatore quando si implementa il modello di modello visualizzazione relatore +++ (MVP), è possibile utilizzare inserimento dipendenza per estendere accoppiamento tra queste classi. Esempio la tipo relatore o il tipo di classe base e il segno di attributo la proprietà con una dipendenza, come illustrato nell'esempio successivo semplicemente definire una proprietà della classe di visualizzazione:
C#
// Variable to hold reference to controller.
private IPresenter _presenter;
// Property that exposes the presenter in the view class. Unity will inject
// this automatically because it carries the Dependency attribute.
[Dependency]
public IPresenter MyViewPresenter
{
get { return _presenter; }
set { _presenter = value; }
}
Nota: gli attributi sono il modo più rapido per specificare le proprietà per inserire. Se non desidera utilizzare gli attributi (per evitare l'associazione di classi al contenitore) è possibile invece utilizzare un file di configurazione o l'API di unità per specificare le proprietà che devono essere inserite.
Quando si crea la visualizzazione per la risoluzione tramite il contenitore, unità rileverà l'attributo di relazione, automaticamente risolvere un'istanza della classe appropriata relatore concreto e impostato come valore della proprietà della classe di visualizzazione. L'avvio veloce inclusa in unità illustrato questo approccio in un'applicazione Windows Form. Effettivamente risolve il form principale per l'applicazione tramite il contenitore, che determina l'unità creare e riempire più dipendenze nell'ambito dell'intera applicazione, utilizzando costruttore e inserimento di impostazione di proprietà.
Estendere l'utente corrente
Unità fornisce un'ampia gamma di funzionalità correlate DI, ma c'è sempre qualcosa aggiuntivo che si desidera ottenere. La richiesta con unità era di mantenerlo sufficientemente generico per soddisfare il numero massimo di requisiti, durante la fase estensibile in modo che si può adattarsi alle diverse esigenze specifiche. Questa operazione viene eseguita utilizzando le estensioni di contenitore, che consentono di eseguire pressoché qualsiasi operazione in termini di gestione di creazione dell'oggetto e il recupero.
Ad esempio, le Guide rapide inclusi in unità illustrano un'estensione del contenitore che implementa un semplice meccanismo di Publish\Subscribe basato su attributi. Come unità crea istanze di oggetti, cavi i gestori eventi per essi base agli attributi nei file di classe. Un altro esempio genera informazioni di registrazione dettagliate crea o recupera ogni tipo tramite il contenitore che consente di durante il debug di applicazioni complesse.
Questa flessibilità di grandi dimensioni viene fornito su poiché unità consente di interagire con il meccanismo di generatore di oggetto sottostante mediante l'estensione del contenitore. Ah, è possibile pronunciare, ma oggetto generatore è estremamente difficile da utilizzare ed non è documentato. Infatti, la documentazione di unità è in di contengono informazioni relative oggetto generatore in termini di come interagire con esso dall'estensione di una contenitore e gli esempi di avvio veloce forniscono tutto il codice di esempio è possibile utilizzare e modificare.
Riepilogo
Sono disponibili numerose visualizzazioni sull'architettura di applicazione e di progettazione. Il 42010:2007 standard ISO/IEC/IEEE 1471 "consigliata esercitazione per Architettura descrizione dell'utilizzo di software Systems" descrive Architettura software come "organizzazione fondamentale di un sistema embodied nei relativi componenti, le relative relazioni tra loro e per l'ambiente e i principi Guida la progettazione e l'evoluzione". Tuttavia, nel suo libro modelli di applicazione Architettura aziendale (Addison-Wesley, 2002) Martin Fowler segnala che ".. .in fine Architettura boils verso il basso a qualsiasi i contenuti importanti, " che è molto più semplice possibile acquisire lo spirito di architettura software.
La Guida all'architettura di Microsoft Application (seconda edizione) consentirà di comprendere quali contenuti importanti in modo che è possibile creare meglio, applicazioni di qualità superiore più rapidamente e in modo più efficiente. Come si è visto in questo articolo, un'area specifica, sfruttando i motivi infiltrazione di relazione e Inversione del controllo, consentono di ottenere numerose gli obiettivi di progettazione promossi dalla Guida TV. Sono incluse la separazione dei problemi, l'utilizzo di astrazione per implementare accoppiamento separato tra livelli, percorso del servizio e implementazione di caratteristiche per la gestione migliorata dei crosscutting problemi.
Alex Homer è un ingegnere di documentazione lavorando il team di modelli e procedure di Microsoft. Sua ravings casuale su durata, tecnologia e tutto il mondo in genere possibile trovare all'https://blogs.msdn.com/alexhomer/.