2013-04-27 12 views
5

Ho il seguente codice nel semplice contenitore iniettore CIO:Ninject equivalente per il metodo SimpleInjector RegisterDecorator

container.RegisterDecorator(typeof(ICommandHandler<>), 
    typeof(ValidationCommandHandlerDecorator<>)); 

ho bisogno di tradurre questo per Ninject equivalente. Ho letto che il modello Decorator in Ninject viene fatto tramite il metodo WhenInjectedInto, ma l'intera biding fa obbligo come 3 parametri come qui:

Bind<IRepository>().To<SimpleRepository> 
    .WhenInjectedInto<AdvancedRespository>(); 

Questo metodo semplice iniettore richiede solo 2, in modo da poter mi dica per favore cosa mi manca qui?

risposta

2

Penso che non ci sia un equivalente diretto alla funzionalità di RegisterDecorator di SimpleInjector. Se ho capito bene, questo definisce che ogni volta che richiedi un ICommandHandler otterrai un ValidationCommandHandlerDecorator restituito che decora alcuni ICommandHandler di default. In Ninject devi fare questo come hai già fatto. Almeno non sono a conoscenza di alcuna funzionalità o estensione che fornisce direttamente quel meccanismo.

Vedi anche questa domanda How the binding are done with decorators using Ninject?

1

Dopo aver letto su pittura interni a semplice iniettore, io non vedo proprio come è diverso da un normale iniezione. Perché non puoi farlo?

kernel.Bind(typeof(ICommandHandler<>))() 
     .To(typeof(ValidationCommandHandlerDecorator<>)) 

Se è necessario controllare che i diversi tipi vengono iniettati in base al tipo di oggetto, quindi si può usare il .WhenInjectedInto()

+3

La differenza tra tra l'applicazione decoratori con semplice iniettore vs la maggior parte degli altri contenitori, è che i decoratori in Simple Injector non sono registrati ma diventano parte di una registrazione esistente (cambiano/intercettano la registrazione reale). Nella maggior parte dei casi questa differenza è irrilevante, ma rende alcuni scenari notevolmente più semplici. Gli utenti di Simple Injector spesso applicano decoratori condizionatamente (in base a qualche vincolo o predicato di tipo generico). Questo è qualcosa che è spesso molto più difficile da fare con altri framework. Spesso non è impossibile, ma semplicemente non è così pulito. – Steven

+0

@Steven - Ninject offre anche la funzionalità di intercettazione ed è possibile utilizzare un tipo o un predicato per controllare ciò che viene iniettato in cosa (usando '.When()' per un predicato). Non riesco ancora a capire la differenza qui, e la frase "non si registra ma diventa parte di una registrazione esistente" sembra inutile. Perché dovresti registrare una cosa se intendi registrare una cosa diversa? Basta cambiare la registrazione, questo è il punto chiave per fare la registrazione di una configurazione. –

+4

Funzionalmente le capacità di intercettazione di Ninject sono molto simili alle capacità di decoratore di Simple Injector, ma intercettazione! = Decorazione. Una differenza è che i decoratori sono più puliti degli intercettori, ad esempio perché possono essere scritti in un modo agnostico quadro, mentre un intercettore deve implementare una determinata interfaccia (specifica per il framework). La differenza potrebbe sembrare insignificante per te, ma non tutti gli sviluppatori si sentono in quel modo. Ecco perché Simple Injector si concentra sulla decorazione anziché sull'intercettazione. – Steven

Problemi correlati