login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[C#] Generics probleem (Opgelost)

Offline SouSUKe - 15/06/2009 13:05 (laatste wijziging 15/06/2009 13:35)
Avatar van SouSUKeNieuw lid Hallo, iedereen.

Ik ben een beginnend c# programmeur met een achtergrond in J2EE en generics.

Maar ik ben een raar probleem tegengekomen tijdens het uitproberen van nhibernate en spring.net.
Kleine schets van de situatie.

Ik werk met services om database transacties te verrichten op bepaalde objecten.

Ik heb een base interface om de CRUD acties te definieren en later geimplementeerd met Service<DomainObject>
Elke object die naar de database wordt weggeschreven extends van DomainObject

  1. namespace DenaHibernate.Service.Interfaces
  2. {
  3. public interface IService<D>
  4. where D : DomainObject
  5. {
  6. // create
  7. D Create(D entity);
  8. // read
  9. D Read(long sid);
  10. // update
  11. D Update(D entity);
  12. // delete
  13. void Delete(D entity);
  14. }
  15. }


Als men een object UserLogin hebben dan bestaat er een een ILoginService die IService<UserLogin> gaat implementeren

De implementatie:

  1. namespace DenaHibernate.Service.Implementation
  2. {
  3. public class LoginService: Service<UserLogin>, ILoginService
  4. {
  5. }
  6. }


Dus hier hebben we een basis voorbeeld van inheritance m.a.w. ILoginService is een IService<DomainObject> waar we IService<UserLogin> gaan implementeren zodat alle CRUD acties een UserLogin gaat teruggeven of verwijderen uit de database.

De declaraties van de IService<DomainObject> wordt in een xml configuratie gedefinieerd en spring.net doet de rest voor je (principe van Dependency Injection)

Om de services te kunnen gebruiken heb ik een BeanLocator aangemaakt die de gevraagde service gaat opzoeken in de xml configuratie.

BeanLocator
  1. namespace DenaHibernate.Service.Locator
  2. {
  3. public class BeanLocator
  4. {
  5. private static IApplicationContext context;
  6. private static BeanLocator locator;
  7.  
  8. private BeanLocator()
  9. {
  10. context = new XmlApplicationContext(new String[] { "~/service.xml" });
  11. }
  12. public static BeanLocator Instance()
  13. {
  14. if (locator == null)
  15. {
  16. locator = new BeanLocator();
  17. }
  18.  
  19. return locator;
  20. }
  21.  
  22. // where T : IService<DomainObject> is van belang voor de basis CRUD acties
  23. public T getBean<T>()
  24. where T : IService<DomainObject>
  25. {
  26. String beanName = typeof(T).ToString();
  27. int lastIndex = beanName.LastIndexOf(".") + 1;
  28.  
  29. return (T)context.GetObject(beanName.Substring(lastIndex));
  30. }
  31. }
  32. }

Ergens in mijn code gebruik ik de beanlocator om mijn IloginService te kunnen gebruiken.

ILoginService loginService = (ILoginService) BeanLocator.GetBean<ILoginService>();

Maar dan krijg ik een foutmelding:

Error 7 The type 'DenaHibernate.Service.Interfaces.ILoginService' cannot be used as type parameter 'T' in the generic type or method 'DenaHibernate.Manager.Management.GetService<T>()'. There is no implicit reference conversion from 'DenaHibernate.Service.Interfaces.ILoginService' to 'DenaHibernate.Service.Interfaces.IService<DenaHibernate.Domain.DomainObject>'. D:\dena\project\DenaHibernate\DenaHibernate\WebPages\EditUser.aspx.cs 40 21 DenaHibernate

Maar in dit voorbeeld is ILoginService een IService<UserLogin>

In bestaande java code die ik heb geschreven gebruik ik de zelfde programmeer benadering nml

  1. @SuppressWarnings("unchecked")
  2. public <S extends SwiService> S getBean(Class<S> clazz) {
  3. return (S) context.getBean(ServiceUtilities.getSimpleClassName(clazz));
  4. }


Hier zien we dat we een SwiService gaan terug krijgen als men een SwiService class als parameter geven.
In java werkt het zoals ik het verwacht maar in C# geeft die een "casting" probleem en dat kan niet.

Ik heb het al geprobeerd om T ipv ILoginService maar dan stappelt het probleem hoger op en het is geen oplossing voor me

Graag hulp en uitleg waarom dit niet werkt.

Mvg,

Daniel Noulet


EDIT

Opgelost:

Gewoon in mijn BeanLocator de type van DomainObject meegegeven

  1. namespace DenaHibernate.Service.Locator
  2. {
  3. public class BeanLocator<D>
  4. where D : DomainObject
  5. {
  6. private static IApplicationContext context;
  7. private static BeanLocator<D> locator;
  8.  
  9. private BeanLocator()
  10. {
  11. //context = ContextRegistry.GetContext();
  12. context = new XmlApplicationContext(new String[] { "~/service.xml" });
  13. }
  14. public static BeanLocator<D> Instance()
  15. {
  16. if (locator == null)
  17. {
  18. locator = new BeanLocator<D>();
  19. }
  20.  
  21. return locator;
  22. }
  23.  
  24. public T getBean<T>()
  25. where T : IService<D>
  26. {
  27. String beanName = typeof(T).ToString();
  28. int lastIndex = beanName.LastIndexOf(".") + 1;
  29. String interfaceNaam = beanName.Substring(lastIndex);
  30.  
  31. return (T)context.GetObject(interfaceNaam.Substring(1));
  32. }
  33. }
  34. }

0 antwoorden

Gesponsorde links
Er zijn nog geen reacties op dit bericht.
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.197s