2013-03-05 2 views
0

Dans mon code j'ai beaucoup d'actions répétées comme ça. Je veux écrire une méthode générique (avec réflexion) pour automatiser ce processus de référentiels d'enregistrement pour cette objets avec une classe de baseComment automatiser l'enregistrement Unity?

 _container.RegisterType(typeof(IFinanceRepository<User, int>), typeof(UsersRepository), new TransientLifetimeManager(), new InjectionMember[] { }); 
     _container.RegisterType(typeof(IFinanceRepository<News, int>), typeof(NewsRepository), new TransientLifetimeManager(), new InjectionMember[] { }); 
     _container.RegisterType(typeof(IFinanceRepository<Currency, int>), typeof(CurrenciesRepository), new TransientLifetimeManager(), new InjectionMember[] { }); 
     _container.RegisterType(typeof(IFinanceRepository<Language, int>), typeof(LanguagesRepository), new TransientLifetimeManager(), new InjectionMember[] { }); 

Et

public class UsersRepository : EFFinanceRepository<User, int> 

Tous les objets (utilisateurs, Nouvelles, etc ont interface de base - IObject il T - est le type de propriété ID (Guid, int, etc.)

public class User : IObject<int> 
{ 
    /// <summary> 
    /// every object ID 
    /// </summary> 
    public int ID { get; set; } 

Tous les dépôts ont la classe de base

IOvolimeFinanceRepository<T, in IDType> 

Où T - IObject (Utilisateur, Nouvelles) idtype - Type de propriété ID chaque objet i

Aidez-moi, s'il vous plaît generane résumé complet méthode générique pour automatiser cela!

Répondre

0

Vous devez ajouter une interface simple pour vous l'interface principale du référentiel (IOvolimeFinanceRepository) - IGenericRepository

var types = Assembly.GetExecutingAssembly().GetTypes(); 

     var concreteRepositoryTypes = (from t in types 
             where !t.IsAbstract && typeof(IGenericRepository).IsAssignableFrom(t) 
             select t).ToList(); 

     foreach (var repositoryType in concreteRepositoryTypes) 
     { 
      //register like _container.RegisterType(typeof(UsersRepository), typeof(UsersRepository), new TransientLifetimeManager(), new InjectionMember[] { }); 
      _container.RegisterType(repositoryType, new TransientLifetimeManager(), new InjectionMember[] { }); 

      var interfaceForRepository = repositoryType.GetInterfaces().FirstOrDefault(x => x != typeof(IGenericRepository)); 

      if(interfaceForRepository != null) 
       _container.RegisterType(interfaceForRepository, repositoryType, new TransientLifetimeManager(), new InjectionMember[] { }); 
     } 
    }