Vous rencontrez un problème avec le modèle de référentiel combiné à l'utilisation de classes abstraites.Problème avec le modèle de référentiel et les classes abstraites
J'ai un référentiel qui implémente une méthode unique renvoyant une ICollection d'un type abstrait.
Voici mon abstrait classe:
public abstract class Location
{
public abstract string Name { get; set; }
public abstract LocationType Type { get; }
}
Voici une concrète mise en œuvre de cette classe abstraite:
public class Country : Location
{
public override string Name { get; set; }
public override LocationType Type { get { return LocationType.Country; } }
}
Voici mon dépôt:
public class LocationsRepository : Locations.Repository.ILocationsRepository
{
public ICollection<Location> GetAllLocations()
{
Country america = new Country { Name = "United States" };
Country australia = new Country { Name = "Australia" };
State california = new State { Name = "California", Country = america };
return new List<Location>() { america, australia, california };
}
}
Tout va bien jusqu'ici.
Maintenant le service :
public class CountryService : ICountryService
{
private ILocationsRepository repository;
public CountryService()
{
// in reality this is done by DI, but made 'greedy' for simplicity.
this.repository = new LocationsRepository();
}
public List<Country> GetAllCountries()
{
// errors thrown by compiler
return repository.GetAllLocations()
.Where(l => l.Type == LocationType.Country)
.ToList<Country>();
}
}
Il y a le problème. J'essaie de renvoyer une liste de types concrets (Country
) à partir d'un référentiel qui renvoie un ICollection<T>
d'un type abstrait.
Obtenez 2 erreurs de compilation:
'System.Collections.Generic.IEnumerable' ne contient pas une définition pour 'ToList' et la meilleure méthode d'extension de surcharge « System.Linq. ParallelEnumerable.ToList (System.Linq.ParallelQuery) » a des arguments invalides
et
argument instance: ne peut pas convertir 'System.Collections.Generic.IEnumerable' à 'System.Linq.ParallelQuery'
Alors, comment puis-je mettre en œuvre ce modèle?
Je peux comprendre le problème (vous ne pouvez pas instancier un type abstrait), de même l'énumérateur (.ToList) tente-t-il d'instancier ce problème, d'où l'erreur?
Si vous ne comprenez pas ce que im essayant de faire:
- Je veux que mon dépôt pour retourner un
ICollection<T>
d'un type abstrait - Je veux que mes services (je vais avoir un pour chaque béton type) pour renvoyer une liste de types concrets basée sur cette seule méthode de référentiel
Est-ce juste un cas de syntaxe LINQ? Ou mon modèle de conception est-il totalement faux?
+1 C'est totalement la meilleure solution. –
Génial, c'était donc un problème LINQ, pas un problème abstrait/référentiel. Merci!! – RPM1984