2014-04-27 5 views
6

Wie Einheit kann alle Instanzen einer Schnittstelle erhalten und dann auf sie zugreifen?Wie registriert man alle Arten einer Schnittstelle und bekommt eine Instanz von ihnen in Einheit?

-Code Stücke werden von hier genommen: Fail-Tracker

In StrcutureMap seine möglich, alle Arten von einer Schnittstelle aus einer Assembly zu registrieren und sie dann Zugriff wie folgt vor:

public class TaskRegistry : Registry 
{ 
    public TaskRegistry() 
    { 
     Scan(scan => 
     { 
      scan.AssembliesFromApplicationBaseDirectory(
       a => a.FullName.StartsWith("FailTracker")); 
      scan.AddAllTypesOf<IRunAtInit>(); 
      scan.AddAllTypesOf<IRunAtStartup>(); 
      scan.AddAllTypesOf<IRunOnEachRequest>(); 
      scan.AddAllTypesOf<IRunOnError>(); 
      scan.AddAllTypesOf<IRunAfterEachRequest>(); 
     }); 
    } 
} 


    ObjectFactory.Configure(cfg => 
     { 

      cfg.AddRegistry(new TaskRegistry()); 

     }); 

und dann alle Arten zugreifen Umsetzung diese Schnittstellen wie:

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

      foreach (var task in container.GetAllInstances<IRunAtStartup>()) 
      { 
       task.Execute(); 
      } 
     } 

Was ist das Äquivalent dieses Codes in Einheit?

Wie kann ich diese bei Application_BeginRequest wie StructureMap bekommen

public void Application_BeginRequest() 
    { 
     Container = ObjectFactory.Container.GetNestedContainer(); 

     foreach (var task in Container.GetAllInstances<IRunOnEachRequest>()) 
     { 
      task.Execute(); 
     } 
    } 

Antwort

21

Unity 3 hinzugefügt registration by convention die Masse Registrierung zu tun.

Außerdem hat Unity das Konzept, ein unbenanntes Mapping und viele benannte Mappings zu registrieren. Das unbenannte Mapping wird beim Aufrufen von Resolve() oder einer seiner Überladungen aufgelöst. Alle benannten Zuordnungen (und nicht die unbenannte Zuordnung) werden beim Aufrufen von ResolveAll() oder einer seiner Überladungen aufgelöst.

// 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<IRunOnEachRequest>()) 
    task.Execute();