2010-02-11 16 views
6

Używam Unity i Unity.AutoRegistration. Ta linia dla Jedności:Używanie Unity, Jak mogę autoregryfikować klasę ogólną z interfejsem generycznym bez rejestrowania KAŻDEGO jej typu.

unityContainer.RegisterType(typeof(IAction<>), typeof(Action<>)); 

skutecznie rejestruje każdą klasę w projekcie IAction/Działanie:

unityContainer.RegisterType<IAction<ObjectA>, Action<ObjectA>>(); 
unityContainer.RegisterType<IAction<ObjectB>, Action<ObjectB>>(); 
unityContainer.RegisterType<IAction<ObjectC>, Action<ObjectC>>(); 
[...] 
unityContainer.RegisterType<IAction<UnrelatedObject>, Action<UnrelatedObject>>(); 
[...] 

Ale chcę tylko konkretne obiekty mają być rejestrowane. Jak to zrobić? Domyślam się, że do niestandardowych klas dodano niestandardowy dekorator atrybutów.

[ActionAtribute] 
public class ObjectB 
{ [...] } 

I spróbuj użyć Unity.AutoRegistration. To tutaj utknąłem w:

unityContainer.ConfigureAutoRegistration() 
    .Include(If.DecoratedWith<ActionAtribute>, 
      Then.Register() 
      .As ?? // I'm guessing this is where I specify 
      .With ?? // IAction<match> goes to Action<match> 
      ) 
    .ApplyAutoRegistration(); 

Odpowiedz

6

Metoda Include ma przeciążenie, które pozwala przejść lambda, aby zarejestrować swój typ. Aby osiągnąć dokładnie to, co chcesz z atrybutami można zrobić tak:

 unityContainer.ConfigureAutoRegistration() 
      .Include(If.DecoratedWith<ActionAtribute>, 
        (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t))) 
      .IncludeAllLoadedAssemblies() 
      .ApplyAutoRegistration(); 

Również pierwszy argument Dołącz metoda jest Predicate, więc jeśli nie chcesz korzystać z atrybutów, ale jakiś inny mechanizm określić jakie rodzaje do włącz lub wyłącz, możesz zrobić tak:

 // You may be getting these types from your config or from somewhere else 
     var allowedActions = new[] {typeof(ObjectB)}; 
     unityContainer.ConfigureAutoRegistration() 
      .Include(t => allowedActions.Contains(t), 
        (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t))) 
      .IncludeAllLoadedAssemblies() 
      .ApplyAutoRegistration(); 
+0

To jest dokładnie to, czego potrzebowałem! Dziękuję za przykład. – Jaguir

+0

Nie sądzę, że jest jakiś sposób, aby to zrobić w konfiguracji przy użyciu Unity 2.0? –

Powiązane problemy