2010-01-09 5 views
2

Quelles sont les meilleures pratiques à configurer après la classe avec spring.NET?Configurer les propriétés statiques avec spring.NET

using System.Collections.Generic; 
using Edu3.DTOModel; 

namespace Edu3.Data.SubsonicProvider.RepositoryFramework 
{ 
    public static class RepositoryFactory 
    { 
     private static readonly Dictionary<string, object> Repositories = 
      new Dictionary<string, object>(); 

     static RepositoryFactory() 
     { 
      Repositories.Add(typeof(ISsoUrlTemplateRepository).Name, 
       new SsoUrlTemplateRepository()); 
      Repositories.Add(typeof(IPackageSessionNodeRepository).Name, 
       new PackageSessionNodeRepository()); 
      Repositories.Add(typeof(IPackageSessionNodeFinishedRepository).Name, 
       new PackageSessionNodeFinishedRepository()); 
     } 

     public static IRepository<TEntity> GetRepository<TEntity, TRepository>() 
      where TEntity : IEntity 
     { 
      var interfaceShortName = typeof(TRepository).Name; 

      // The provider was in the cache, so retrieve it 
      var repository = (IRepository<TEntity>)Repositories[interfaceShortName]; 

      return repository; 
     } 
    } 
} 

Je voudrais ajouter les dépôts avec Spring.NET. Est-ce possible?

Répondre

3

Expose le dictionnaire comme une propriété publique et enlever le modificateur readonly du champ et ne rend pas votre classe statique. Ensuite, utilisez cette configuration:

<object id="RepositoryFactory" type="Edu3.Data.SubsonicProvider.RepositoryFramework. RepositoryFactory, Edu3.Data.SubsonicProvider.RepositoryFramework"> 
    <property name="Repositories"> 
     <dictionary key-type="System.Type" value-type="System.Object"> 
     <entry value-ref="SsoUrlTemplateRepository"> 
      <key> 
      <expression value="T(Edu3.Data.SubsonicProvider.RepositoryFramework.SsoUrlTemplateRepository, Edu3.Data.SubsonicProvider.RepositoryFramework)"/> 
      </key>   
     </entry> 
     </dictionary> 
    </property> 
    </object> 

    <object id="SsoUrlTemplateRepository" type="Edu3.Data.SubsonicProvider.RepositoryFramework.SsoUrlTemplateRepository, Edu3.Data.SubsonicProvider.RepositoryFramework" singleton="false"/> 
+0

Thx, va vérifier dans un instant. –

+0

Qu'est-ce que Spring.Net derrière le rideau? créer une instance de RepositoryFactory? Supplémentaire Je suggérerais de rendre le constructeur par défaut privé – Fabiano

+0

Spring.NET crée une instance, rendant ainsi le constructeur par défaut privé fera échouer. Si vous voulez vraiment appliquer cela, utilisez une méthode d'usine. J'injecterais la fabrique de référentiel dans les objets qui ont besoin d'une référence à un référentiel. – BennyM

1

J'ai le même problème avec l'initialisation de mon application car il n'existe pas de moyen d'appeler des méthodes statiques sur une classe (statique) dans spring.net. Mais vous pouvez essayer de faire votre classe essayer non statique suivante:

public class RepositoryFactory 
{ 
    private static RepositoryFactory instance; 

    private static readonly Dictionary<string, object> Repositories = 
     new Dictionary<string, object>(); 

    private RepositoryFactory() 
    { 
    } 

    public static RepositoryFactory GetInstance() 
    { 
     if (instance == null) 
     { 
      instance = new RepositoryFactory(); 
     } 
     return instance; 
    } 

    public static void AddRepository(object repository) 
    { 
     Repositories.Add(repository.GetType().Name, repository); 
    } 
} 

avec la configuration de printemps:

<objects xmlns="http://www.springframework.net" > 

    <object id="RepositoryFactory" type="Edu3.Data.SubsonicProvider.RepositoryFramework.RepositoryFactory, %ASSEMBLY_NAME%" factory-method="GetInstance"> 
    <property name="AddRepository" value="SsoUrlTemplateRepository" ></property> 
    <property name="AddRepository" value="PackageSessionNodeRepository" ></property> 
    <property name="AddRepository" value="PackageSessionNodeFinishedRepository" ></property> 
    </object> 

    <object id="SsoUrlTemplateRepository" type="SsoUrlTemplateRepository, %ASSEMBLY_NAME%" singleton="false"/> 
    <object id="PackageSessionNodeRepository" type="PackageSessionNodeRepository, %ASSEMBLY_NAME%" singleton="false"/> 
    <object id="PackageSessionNodeFinishedRepository" type="PackageSessionNodeFinishedRepository, %ASSEMBLY_NAME%" singleton="false"/> 

</objects> 
+0

est-ce une solution possible? ou avez-vous trouvé une autre solution en attendant que vous pourriez partager? – Fabiano

+0

Oui, c'est une solution possible. Je vérifie toujours une autre solution. Peut-être que c'est possible avec des expressions printanières ... je ne sais pas, je dois regarder plus en profondeur. Va poster si je trouve quelque chose. –