2015-01-22 14 views
8

Sto tentando di scrivere un attributo di autenticazione da applicare ad alcuni servizi in un'app di servizio WCF (utilizzando Unity e Unity.Wcf).Iniezione di una dipendenza in un attributo utilizzando Unity in WCF

L'autenticazione viene eseguita da un'interfaccia di autenticazione esterna (all'app del servizio) che viene attualmente iniettata tramite la funzione di costruzione nella classe di servizio e richiamata direttamente in ciascun metodo di servizio.

Questo porta a un sacco di codice ripetuto in ciascuno dei metodi di servizio.

Invece, voglio spostarlo su un attributo.

Tuttavia, ho bisogno che l'interfaccia di autenticazione sia accessibile nell'attributo.

Ovviamente, se uso l'injection construction sull'attributo, è un parametro obbligatorio quando decorare il mio metodo di servizio con l'attributo, ma non ho accesso ad esso a questo punto perché è cablato da Unity.

Come posso iniettare (o altrimenti accedere a) l'interfaccia di autenticazione nel mio attributo?

+1

O ricorrere a Service Locator e rendere l'attributo a [Humble Object] (http://xunitpatterns.com/Humble%20Object.html) che delega esclusivamente al servizio che risolve o rende passivo l'attributo, come spiegato [qui] (http://blog.ploeh.dk/2014/06/13/passive-attributes/) e [qui] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php? id = 98). – Steven

+0

Grazie Steven, avrò letto questi link – Shevek

+0

Ho basato la mia opinione su [Mark Seeman's book] (http://amzn.to/12p90MG) e quindi considero il Service Locator un anti-pattern. Ma se Steven avesse dato una risposta invece di un commento, lo avrei svalutato per il collegamento a [attributi passivi] (http://blog.ploeh.dk/2014/06/13/passive-attributes/). – wigy

risposta

0

Se si sta già utilizzando Unity, utilizzare le funzionalità AOP di Unity. L'Aspect Oriented Programing è stato progettato per consentire un'implementazione semplice del codice per gestire i problemi trasversali (come l'autenticazione e l'autorizzazione). Ciò consente di eliminare il codice duplicato e di separare le preoccupazioni trasversali dalla logica aziendale. È possibile iniettare facilmente le dipendenze in aspetti creati con Unity perché vengono risolti dal contenitore in runtime (intercettazione dinamica).

Per creare l'aspetto con unità è sufficiente implementare l'interfaccia IInterceptionBehavior e applicarla al servizio che si desidera decorare durante la registrazione del contenitore (istruzioni here).

All'interno dell'aspetto è possibile leggere facilmente tutti gli attributi applicati al metodo che viene intercettato in modo da poter inserire i ruoli che devono essere soddisfatti per lo scenario di autenticazione nell'attributo (ma nessun comportamento).

Ho creato un demo solution per spiegare AOP, utilizza CastleWindsor non Unity ma si applicano gli stessi principi.