2014-04-27 12 views
6

Bir arabirim bir arabirimin tüm örneklerini nasıl alabilir ve sonra bunlara erişebilir?Her bir arayüzün nasıl kaydedileceği ve bunların bir bütün olarak nasıl bir araya getirileceği.

Kod parçaları buradan alınır: Fail-Tracker StrcutureMap yılında

olası bir derleme bir arayüz her türlü kayıt ve aşağıdaki gibi bunlara erişmek için:

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()); 

     }); 

ardından uygulayan her türlü erişmek gibi arabirimler:

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

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

Bu kodun birliği eşdeğer nedir?

Nasıl StructureMap

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

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

cevap

21

Birlik 3 gibi Application_BeginRequest de bu alabilirim kitle kaydını yapmak registration by convention eklendi. Ayrıca, Unity, adlandırılmamış bir eşleştirmeyi ve birçok adlandırılmış eşleştirmeyi kaydetme kavramına sahiptir. Adsız eşleme Resolve() veya aşırı yüklenmelerden biri çağrılırken çözülecektir. ResolveAll() veya aşırı yüklenmelerden biri çağrıldığında, adlandırılmış eşlemelerin tümü (ve adlandırılmamış eşlemenin değil) çözülür.

// 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(); 
İlgili konular