2015-01-22 29 views
8

Próbuję napisać atrybut uwierzytelniania, aby zastosować do niektórych usług w aplikacji usługi WCF (przy użyciu Unity i Unity.Wcf).Wstrzykiwanie zależności do atrybutu za pomocą Unity w WCF

Uwierzytelnienie przeprowadzane jest przez zewnętrzny interfejs uwierzytelniający (do aplikacji serwisowej), który jest obecnie wstrzykiwany za pomocą wstrzyknięcia konstrukcyjnego do klasy serwisowej i wywoływany bezpośrednio w każdej z metod serwisowych.

Prowadzi to do wielu powtarzających się kodów w każdej z metod serwisowych.

Zamiast tego chcę przenieść to do atrybutu.

Potrzebuję jednak, aby interfejs uwierzytelniania był dostępny w atrybucie.

Oczywiście, jeśli użyję iniekcji konstrukcyjnej na atrybucie, to jest to wymagany parametr podczas dekorowania mojej metody usługi atrybutem, ale nie mam do niego dostępu w tym momencie, ponieważ jest on połączony przez Unity.

Jak mogę wstrzyknąć (lub w inny sposób uzyskać dostęp do) interfejs uwierzytelniania w moim atrybucie?

+1

Powróć do Service Locator i ustaw atrybut [Humble Object] (http://xunitpatterns.com/Humble%20Object.html), który tylko deleguje na usługę, którą rozwiązuje, lub uczyń atrybut pasywnym, jak wyjaśniono [tutaj] (http://blog.ploeh.dk/2014/06/13/passive-attributes/) i [tutaj] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php? id = 98). – Steven

+0

Dzięki Steven, przeczytam te linki. – Shevek

+0

Opieram moją opinię na [Mark Seeman's book] (http://amzn.to/12p90MG) i dlatego traktuję Lokalizator Usług jako anty-wzór. Ale jeśli Steven udzieliłby odpowiedzi zamiast komentarza, wzniosłbym go za link do [atrybutów pasywnych] (http://blog.ploeh.dk/2014/06/13/passive-attributes/). – wigy

Odpowiedz

0

Jeśli już używasz Unity, używałbym funkcji AOP w Unity. Programowanie zorientowane na aspekt zaprojektowano w celu umożliwienia łatwej, suchej implementacji kodu do obsługi problemów przekrojowych (takich jak uwierzytelnianie i autoryzacja). Pozwala to pozbyć się zduplikowanego kodu, a także eliminuje problem przekrojowy z logiki biznesowej. Możesz łatwo wstrzykiwać zależności w aspekty utworzone za pomocą Unity, ponieważ są one rozwiązywane z kontenera w czasie wykonywania (dynamiczne przechwytywanie).

Aby utworzyć aspekt za pomocą jedności, wystarczy zaimplementować interfejs IInterceptionBehavior i zastosować go do usługi, którą użytkownik będzie ozdabiać podczas rejestracji pojemnika (instrukcje here).

Wewnątrz aspektu można łatwo odczytać wszystkie atrybuty zastosowane do przechwyconej metody, dzięki czemu można umieścić role, które muszą być spełnione w scenariuszu uwierzytelniania w atrybucie (ale bez zachowania).

Stworzyłem demo solution w celu wyjaśnienia AOP, wykorzystuje on CastleWindsor not Unity, ale obowiązują te same zasady.