2011-11-15 17 views
5

Sto tentando di applicare la funzionalità di supporto di autofac decorator al mio scenario senza esito positivo. Sembra che nel mio caso non assegni correttamente il nome alle registrazioni.Generazione automatica di generatori aperti decorati mediante scansione di assieme

C'è un modo per registrare i tipi di assembly scansionati con un nome, in modo che io possa in seguito usarlo nella chiave decor decor aperta?

O forse ho sbagliato completamente e fare qualcosa di inappropriato qui?

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly) 
    .AsClosedTypesOf(typeof(IAggregateViewRepository<>)) //here I need name, probably 
    .Named("view-implementor", typeof(IAggregateViewRepository<>)) 
    .SingleInstance(); 

builder.RegisterGenericDecorator(typeof(CachedAggregateViewRepository<>), 
    typeof(IAggregateViewRepository<>), fromKey: "view-implementor"); 

risposta

13

Ecco un tentativo, non davanti a Visual Studio in modo risoluzione di sovraccarico potrebbe non essere esattamente a destra:

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly) 
    .As(t => t.GetInterfaces() 
       .Where(i => i.IsClosedTypeOf(typeof(IAggregateViewRepository<>)) 
       .Select(i => new KeyedService("view-implementor", i)) 
       .Cast<Service>()) 
    .SingleInstance(); 
  • Named() è lo zucchero sintattico per Keyed(), che associa il componente con un KeyedService
  • As() accetta un Func<Type, IEnumerable<Service>>

Sarà inoltre necessario:

using Autofac; 
using Autofac.Core; 
+0

funziona come un fascino! Molte grazie! – achekh

+0

Ottimo! Felice di sentirlo. –

+1

Questo ha funzionato anche per me. Non credo che il cast () sia necessario, comunque. – luksan

2

Se si voleva ripulire il codice di registrazione si potrebbe anche definire il seguente metodo di estensione in più (molto prolisso e in base alla sorgente autofac per l'altro di sovraccarico, ma solo deve essere definito una volta):

using Autofac; 
using Autofac.Builder; 
using Autofac.Core; 
using Autofac.Features.Scanning; 

public static class AutoFacExtensions 
{ 
    public static IRegistrationBuilder<TLimit, TScanningActivatorData, TRegistrationStyle> 
     AsClosedTypesOf<TLimit, TScanningActivatorData, TRegistrationStyle>(
      this IRegistrationBuilder<TLimit, TScanningActivatorData, TRegistrationStyle> registration, 
      Type openGenericServiceType, 
      object key) 
     where TScanningActivatorData : ScanningActivatorData 
    { 
     if (openGenericServiceType == null) throw new ArgumentNullException("openGenericServiceType"); 

     return registration.As(t => 
      new[] { t } 
      .Concat(t.GetInterfaces()) 
      .Where(i => i.IsClosedTypeOf(openGenericServiceType)) 
      .Select(i => new KeyedService(key, i))); 
    } 
} 

che permetterebbe di fare semplicemente questo:

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly) 
    .AsClosedTypesOf(typeof(IAggregateViewRepository<>), "view-implementor") 
    .SingleInstance(); 
Problemi correlati