Come registrare tutti i tipi di un’interfaccia e ottenerne l’istanza in unità?

In che modo l’unità può ottenere tutte le istanze di un’interfaccia e quindi accedervi?

I pezzi di codice sono presi da qui: Fail-Tracker

In StrcutureMap è ansible registrare tutti i tipi di un’interfaccia da un assembly e quindi accedervi come segue:

public class TaskRegistry : Registry { public TaskRegistry() { Scan(scan => { scan.AssembliesFromApplicationBaseDirectory( a => a.FullName.StartsWith("FailTracker")); scan.AddAllTypesOf(); scan.AddAllTypesOf(); scan.AddAllTypesOf(); scan.AddAllTypesOf(); scan.AddAllTypesOf(); }); } } ObjectFactory.Configure(cfg => { cfg.AddRegistry(new TaskRegistry()); }); 

e quindi accedere a tutti i tipi che implementano tali interfacce come:

  using (var container = ObjectFactory.Container.GetNestedContainer()) { foreach (var task in container.GetAllInstances()) { task.Execute(); } foreach (var task in container.GetAllInstances()) { task.Execute(); } } 

Qual è l’equivalente di questo codice in unità?

Come posso ottenere questi a Application_BeginRequest come structuremap

 public void Application_BeginRequest() { Container = ObjectFactory.Container.GetNestedContainer(); foreach (var task in Container.GetAllInstances()) { task.Execute(); } } 

Unity 3 ha aggiunto la registrazione per convenzione per fare la registrazione di massa.

Inoltre, Unity ha il concetto di registrazione di una mapping senza nome e di molti mapping denominati. La mapping senza nome verrà risolta quando si chiama Resolve () o uno dei suoi overload. Tutti i mapping denominati (e non la mapping senza nome) verranno risolti quando si chiama ResolveAll () o uno dei relativi overload.

 // There's other options for each parameter to RegisterTypes() // (and you can supply your own custom options) container.RegisterTypes( AllClasses.FromLoadedAssemblies(). Where(type => typeof(IRunOnEachRequest).IsAssignableFrom(type)), WithMappings.FromAllInterfaces, WithName.TypeName, WithLifetime.Transient); foreach (var task in container.ResolveAll()) task.Execute();