2012-04-20 8 views
6
 var servers = new List<IChecker> { 
     //Server1 
     new DatabaseSystem { ServerName = "ANTIVIRUS" }, 
     new DatabaseSizes { ServerName = "ANTIVIRUS"}, 
     new DiskBackup { ServerName = "ANTIVIRUS"}, 
     new SqlServerEventLog { ServerName="ANTIVIRUS"}, 
     new DiskSystem { ServerName="ANTIVIRUS"}, 
     //Server1 
     new DatabaseSystem { ServerName="SEJKG-S-DB01" }, 
     new DatabaseSizes { ServerName = "SEJKG-S-DB01"}, 
     new DiskBackup { ServerName = "SEJKG-S-DB01"}, 
     new SqlServerEventLog { ServerName="SEJKG-S-DB01"}, 
     new DiskSystem { ServerName="SEJKG-S-DB01"}, 
    }; 

    var builder = new ContainerBuilder();    
    builder.RegisterInstance(notifiers).As<IList<INotifier>>();  
    builder.RegisterInstance(servers).As<IList<IChecker>>(); 
    builder.Register(c => new ServerChecker(c.Resolve<IList<IChecker>>(), c.Resolve<IList<INotifier>>())); 
    return builder.Build(); 

Ho un problema con come dovrei registrare il mio "dove server = new List {..} 'per il contenitore Builder. La mia lista dei iChecker passato come parametro ad un ServerChecker. tanto sono stato in grado di risolvere, ma non la lista stessa, ma devo avere al di fuori. l'elenco consueto dei server è molto maggiore.Come registrare un nuovo elenco di <IChecker> Autofac ContainerBuilder

risposta

9

Autofac ha implicit collection support tale che si può registrare più singoli elementi e quando si risolve un IEnumerable di tali elementi si ottengono tutte le registrazioni:

Ciò consentirebbe di semplificare notevolmente le registrazioni poiché non si dovrebbe effettivamente costruire l'elenco in anticipo - si potrebbe semplicemente registrare ciascuna delle istanze "IChecker" o "Inotifier" direttamente e risolvere l'IEnumerable di loro.

Se avete la possibilità di cambiare il vostro costruttore "ServerChecker" a prendere IEnumerable piuttosto che IList, allora il gioco è fatto - non c'è bisogno di fare la cosa più c.Resolve(). Probabilmente è un design migliore perché IList implica che la collezione può essere modificata in seguito, il che probabilmente non è ciò che desideri. (È possibile che ServerChecker copi il contenuto dell'IEnumerable nel proprio elenco in modo da poter modificare una copia locale, ma non si vorrebbe che la gente pensasse di poter o debba modificare il contenuto della dipendenza centrale del genere.)

Se deve essere IList, si potrebbe aggiungere un altro di registrazione che crea la lista al volo:

builder 
    .Register(c => new List<IDependency>(c.Resolve<IEnumerable<IDependency>>())) 
    .As<IList<IDependency>>(); 

in questo modo è ancora possibile evitare di fare la c.Resolve < ...>() chiamata nella risoluzione per "ServerChecker" - Autofac saprà improvvisamente come creare il tipo specifico di lista.

Se si vuole davvero essere fantasiosi con esso, è possibile add a custom Autofac RegistrationSource in modo tale che se qualcuno cerca di risolvere IList Autofac automaticamente eseguirà la risoluzione dell'IEnumerable e creerà un elenco ... ma è un po 'più di quanto sia probabilmente necessario .

+0

Ho modificato ServerChecker in ServerChecker (IEnumerable Checker, IEnumerable Notificatori). Quindi ha apportato la modifica –

+0

Se la soluzione ha funzionato per te, contrassegnala come risposta. :) –

Problemi correlati