2012-12-17 17 views
15

Aktualnie jestem w trakcie usuwania programu Ninject z mojego projektu i przechodzenia do używania prostego wtryskiwacza, ale jest jedna rzecz, której nie mogę poprawnie uruchomić.Prosty wtryskiwacz: rejestrowanie typu z argumentem konstruktora opartym na jego obiekcie nadrzędnym:

Dla mojego rejestrowania w Załatwienie usług, byłem poprzednio w stanie przekazać w parametrze do mojej klasy rejestrowania jako taki

_kernel.Bind<ILogger>().To<Logger>() 
    .WithConstructorArgument("name", 
     x => x.Request.ParentContext.Request.Service.FullName); 

szukam sposobu, aby odtworzyć to w prosty wtryskiwacza. Do tej pory wszystko inne działa, ale to. Mogę dostać rejestrowanie do pracy, aczkolwiek bez konieczności właściwe nazwy rejestratora pokazano, wykonując następujące czynności:

_container.Register<ILogger>(() => new Logger("test")); 

Ktoś ma jakieś doświadczenia w robieniu czegoś podobnego?

+1

Powiązane: http://stackoverflow.com/questions/13675137/how- do powrotu-an-instancja oparte na jego niepełnej wykorzystujących-proste wtryskiwacza – Steven

Odpowiedz

11

Ta rejestracja jest formą iniekcji opartej na kontekście . Można użyć jednego z RegisterConditional przeciążeń dla tego produktu.

RegisterConditional jednak nie pozwala na stosowanie metod fabrycznych skonstruować typu. Należy więc stworzyć generyczną wersję swojej klasie Logger, w następujący sposób:

public class Logger<T> : Logger 
{ 
    public Logger() : base(typeof(T).FullName) { } 
} 

można zarejestrować go w następujący sposób:

container.RegisterConditional(
    typeof(ILogger), 
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType), 
    Lifestyle.Transient, 
    c => true); 

Ale proszę nie czytać this Stackoverflow question (i moją odpowiedź) i pytanie siebie, czy nie rejestrujesz się za dużo.

5

Context based injection jest obecnie obsługiwana w prosty wtryskiwacza 3 przy użyciu metody RegisterConditional. Na przykład, aby wstrzyknąć Logger do Consumer1 i rejestrator w Consumer2 użyj RegisterConditional przeciążenie, która akceptuje typu realizacja fabrycznego delegata następująco:

container.RegisterConditional(
    typeof(ILogger), 
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType), 
    Lifestyle.Transient, 
    c => true);