2011-07-19 7 views
5

Więc powiedzmy, że mają interfejsu IThingFactory:Dependency Injection: Jak skonfigurować powiązań interfejsu do owijania

public interface IThingFactory 
{ 
    Thing GetThing(int thingId); 
} 

Teraz, powiedzmy, że mam konkretną implementację pobierającą Thing s z bazy danych. Teraz, powiedzmy, że mam konkretną implementację, która owija istniejącą IThingFactory i sprawdza obecność w, powiedzmy, pamięci podręcznej w pamięci przed uderzeniem w opakowaną IThingFactory. Coś jak:

public class CachedThingFactory : IThingFactory 
{ 
    private IThingFactory _wrapped; 
    private Dictionary<int, Thing> _cachedThings; 

    public CachedThingFactory(IThingFactory wrapped) 
    { 
     this._wrapped = wrapped; 
     _cachedThings = new Dictionary<int,Thing>(); 
    } 

    public Thing GetThing(int thingId) 
    { 
     Thing x; 
     if(_cachedThings.TryGetValue(thingId, out x)) 
      return x; 

     x = _wrapped.GetThing(thingId); 

     _cachedThings[thingId] = x; 

     return x; 
    } 
} 

Jak sobie radzić ze scenariusza jak ten przy użyciu iniekcji zależność z czymś takim, powiedzmy, Ninject, tak że mogę skonfigurować kontener DI tak, że można wprowadzić lub usunąć proxy buforowania tak lub, powiedzmy, coś, co robi logowanie, lub (wstaw tutaj)?

Odpowiedz

5

Można zrobić coś wzdłuż linii:

Bind<IThingFactory>().To<DefaultThingFactory>().WhenInjectedInto<CachedThingFactory>(); 
Bind<IThingFactory>().To<CachedThingFactory>(); 

To pozwoli konsumenci nie muszą określić atrybut name, i nadal jest stosunkowo łatwy do dalszego wzmocnienia. Jeśli później chcesz dodać do rejestrowania dodatkową warstwę "dekoratora", możesz zrobić:

Bind<IThingFactory>().To<DefaultThingFactory>().WhenInjectedInto<LoggingThingFactory>(); 
Bind<IThingFactory>().To<LoggingThingFactory>().WhenInjectedInto<CachedThingFactory>(); 
Bind<IThingFactory>().To<CachedThingFactory>(); 

Nie najładniejsza, ale działa.

+0

Nie wiedział nawet, że istnieje metoda WhenInjectedInto(). Dzięki! – FMM

2

Jedną z zalet struktury DI jest to, że nie musisz robić takich rzeczy. Ninject ma różne zakresy, których można użyć do określenia czasu życia obiektów. Zajmie się buforowaniem i innymi rzeczami.

Czytaj więcej tutaj: http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/

+0

Niezupełnie o to pytam. Jestem zaznajomiony z zakresami obiektów Ninject i bardzo mocno stosuję zakres żądań i zakres singletonowy w mojej aplikacji opartej na MVC. Twoja sugestia rozwiązuje mój wymyślony przykład, ale pomija punkt pytania. Jak skonfigurować powiązanie, aby móc "owinąć" interfejs, jak powyżej? – FMM

+0

Coś takiego: 'BindToFactory (). InRequestScope(); ' – Mrchief

+0

Zapomniałem wspomnieć, że jeśli używasz' BindToFactory() ', musisz podłączyć swojego dostawcę - dostosuj swój' CachedThingFactory' do implementacji 'IProvider' (więcej tutaj https://github.com/ninject/ninject/ wiki/Providers% 2C-Factory-Methods-and-the-Activation-Context). Możesz także użyć metody '.ToMethod()'. – Mrchief

2

Przypuszczam szukasz nazwie wiążący, udokumentowany tutaj:

https://github.com/ninject/ninject/wiki/Contextual-Binding

Bind<IThingFactory>().To<CachedThingFactory>().Named("TheCachedThing"); 
Bind<IThingFactory>().To<DefaultThingFactory >().Named("ThePureThing"); 

a następnie

public CachedThingFactory([Named("ThePureThing")] IThingFactory wrapped) 
{ 
    this._wrapped = wrapped; 
    _cachedThings = new Dictionary<int,Thing>(); 
} 

i dla konsumenta CachedThingFactory

public ThingFactoryConsumer([Named("TheCachedThing")] IThingFactory thingFactory) 
{ 
    _thingFactory = thingFactory; 
} 
+0

Byłem już zaznajomiony z nazwanymi powiązaniami; jednak czuje się brudno, aby udekorować moje klasy za pomocą ciągłych atrybutów. – FMM

+0

Nie było całkiem jasne z twojego pytania :-). Warto przeczytać: http://eeichinger.blogspot.com/2009/12/springnet-aop-behind-scenes-1.html od "dekoratora" do "aop". – Andreas

+0

Interesująca lektura, dzięki! Interfejs IMethodInterceptor, który wyszczególnia na następnym blogu, wydaje się jeszcze brudniejszy, chociaż =) – FMM

Powiązane problemy