2009-02-05 14 views
9

Mam interfejs:rejestracja StructureMap Auto dla typów generycznych wykorzystujących skanowanie

IRepository<T> where T : IEntity 

natomiast im pukanie moje UI im korzystania z niektórych fałszywych implementacje repozytorium, które po prostu zwraca żadnych starych danych.

one wyglądać tak:

public class FakeClientRepository : IRepository<Client> 

W tej chwili robię to:

ForRequestedType<IRepository<Client>>() 
    .TheDefaultIsConcreteType<FakeRepositories.FakeClientRepository>(); 

ale Mnóstwo razy dla wszystkich moich IEntities. Czy możliwe jest użycie Scan do automatycznego rejestrowania wszystkich moich fałszywych repozytoriów dla jego odpowiedniego IRepository?

Edit: to ile mam, ale pojawiają się błędy mówiąc żądany typ isnt zarejestrowany :(

Scan(x => 
{ 
    x.TheCallingAssembly(); 
    x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
    x.AddAllTypesOf(typeof(IRepository<>)); 
    x.WithDefaultConventions(); 
}); 

Dzięki

Andrew

Odpowiedz

13

Istnieje prostszy sposób na zrobienie tego. Proszę zobaczyć ten blog delegowania do szczegółów: Advanced StructureMap: connecting implementations to open generic types

public class HandlerRegistry : Registry 
{ 
    public HandlerRegistry() 
    { 
     Scan(cfg => 
     { 
      cfg.TheCallingAssembly(); 
      cfg.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
      cfg.ConnectImplementationsToTypesClosing(typeof(IRepository<>)); 
     }); 
    } 
} 

Robi to w ten sposób unika się konieczności tworzenia własnych ITypeScanner lub konwencje.

6

Dzięki Chris, to dokładnie to, czego potrzebowałem. Dla jasności, heres, co ja identyfikator z linku:

Scan(x => 
{ 
    x.TheCallingAssembly(); 
     x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
    x.With<FakeRepositoryScanner>(); 
}); 


private class FakeRepositoryScanner : ITypeScanner 
{ 
    public void Process(Type type, PluginGraph graph) 
    { 
     Type interfaceType = type.FindInterfaceThatCloses(typeof(IRepository<>)); 
     if (interfaceType != null) 
     { 
      graph.AddType(interfaceType, type); 
     } 
    } 
} 
Powiązane problemy