2010-05-27 9 views
0

Je ne suis pas sûr de savoir comment utiliser StructureMap pour analyser tous les dépôts d'un espace de noms particulier. La plupart des dépôts prennent la forme:Récupérer des dépôts avec Structuremap

namespace CPOP.Infrastructure.Repositories 
{ 
    public class PatientRepository : LinqRepository<Patient>, IPatientRepository 
    { 
    } 
} 

namespace CPOP.Infrastructure.Repositories 
{ 
    public class LinqRepository<T> : Repository<T>, ILinqRepository<T> 
    { 
    } 
} 

namespace CPOP.Domain.Contracts.Repositories 
{ 
    public interface IPatientRepository : ILinqRepository<Patient> 
    { 
    } 
} 

J'ai essayé:

x.Scan(scanner => 
{ 
    scanner.Assembly(Assembly.GetExecutingAssembly()); 
    scanner.ConnectImplementationsToTypesClosing(typeof(ILinqRepository<>)); 
}) 

Mais, il ne capte que la classe LinqRepository. Quelle est la meilleure façon de récupérer les différents dépôts que je vais déposer là-bas?

Et, selon le reuest de Joshua, voici un exemple d'utilisation:

namespace CPOP.ApplicationServices 
{ 
    public class PatientTasks : IPatientTasks 
    { 
     private readonly IPatientRepository _patientRepository; 

     public PatientTasks(IPatientRepository patientRepository) 
     { 
      _patientRepository = patientRepository; 
     } 

     public Patient GetPatientById(int patientId) 
     { 
      int userId; // get userId from authentication mechanism 

      return _patientRepository.FindOne(new PatientByIdSpecification(patientId)); 
     } 

     public IEnumerable<Patient> GetAll() 
     { 
      int userId; // get userId from authentication mechanism 

      return _patientRepository.FindAll(); 
     } 

    } 
} 
+0

Vous avez beaucoup d'interfaces/classes de base passe là-bas. Pouvez-vous montrer un exemple de la façon dont vous allez récupérer un dépôt? Quelle interface demanderez-vous? –

Répondre

2

Cela peut être fait avec juste une ligne de code dans votre configuration. En supposant que vous avez ceci:

Entités: - Client - Ordre

Et un modèle de référentiel générique comme celui-ci:

  • Repository: IRepository

et ont un service d'applications qui ressemble à:

public AppService(IRepository<Customer> custRepo, IRepository<Order> orderRepo) 

Vous auriez quelque chose comme ça. Notez le peu sur l'utilisation du scanner pour raccorder vos dépôts personnalisés.

public class SmRegistry : Registry 
    { 
     public SmRegistry() 
     { 
      For(typeof (IRepository<>)) 
       .Use(typeof (Repository<>)); 

      //using this will find any custom repos, like CustomerRepository : Repository<Customer> 
      //Scan(scanner => 
      //   { 
      //    scanner.TheCallingAssembly(); 
      //    scanner.ConnectImplementationsToTypesClosing(typeof (IRepository<>)); 

      //   }); 
     } 
    } 

En supposant que votre Référentiels sont définis dans une autre assemblée à partir de votre application, vous pouvez utiliser Registries pour accrocher tous ensemble. Consultez ce post:

http://blog.coreycoogan.com/2010/05/24/using-structuremap-to-configure-applications-and-components/

0

Quelque chose comme:

 Assembly ass = Assembly.GetCallingAssembly(); 
     Container.Configure(x => x.Scan(scan => 
     { 
      scan.Assembly(ass); 
      scan.LookForRegistries(); 
     })); 

Puis la classe du Registre:

public sealed class MyRegistry : Registry 
{ 
... 
+0

Je cherchais quelque chose qui permettrait de les collecter automatiquement sans avoir à les spécifier individuellement dans une classe de registre, car ils auront tous des interfaces et des classes dépendantes répétées. – alphadogg