J'ai un service générique qui effectue les mêmes actions contre toute combinaison requête/réponse donnée. La seule fois où quelque chose de spécifique arrive est quand il s'agit de la persistance. J'essaie d'injecter une implémentation spécifique d'un référentiel basé sur l'un des types (TRequest) utilisés. Jusqu'à présent, j'ai ci-dessous, mais Ninject et les tests d'intégration échouant à trouver un référentiel qui correspond à ce qu'il recherche, un référentiel de type EntityBase. Je pensais que ce serait bien que mes entités spécifiques héritent de EntityBase ...C# Argument de méthode de Type IRepository <BaseType> n'accepte pas l'implémentation héritant de BaseType
Erreur CS1503 Argument 1: ne peut pas convertir 'Repositories.IRepository < Models.PersonModel>' à « Repositories.IRepository < Models.EntityBase> '
EDIT: Je sais pourquoi im obtenir l'erreur actuelle, son assez explicite. Des idées comment je peux y parvenir?
PersonModel.cs
public class PersonModel : EntityBase
{
blah blah
}
IRepository.cs
public interface IRepository<T>
{
T Get(int id);
void Add(T entity);
void Delete(int id);
}
PersonRepository.cs
public class PersonRepository : IRepository<PersonModel>
{
blah blah
}
Service.cs
public class Service<TRequest, TResponse> : IService<TRequest, TResponse>
{
private readonly IRepository<EntityBase> _repository;
public Service(IRepository<EntityBase> repository)
{
_respository = repository
}
public TResponse Call(TRequest request)
{
var requestEntity = MapperFactory.GetMapperFor(typeof(TRequest)).Map(request);
_repository.Add(requestEntity)
blah blah blah return
}
}
IoCModule.cs
Bind<IRepository<PersonModel>>().To<PersonRepository>();
Je ne suis pas sûr de bien comprendre le code (Ninject), mais peut-être que votre module IoC devrait 'Bind>(). ();'. Je ne sais pas comment la partie 'To ()' détermine comment créer l'instance de classe. J'essaie juste d'aider. Ou cela va simplement déplacer le problème à un autre endroit –
bixarrio
Si 'TRequest' hérite de' EntityBase' vous pouvez changer 'IRepository' –
Je suis d'accord avec @ArturoMenchaca. Sur la base de 'Call (demande TRequest)' dans le service, le référentiel doit être 'IRepository'. –
bixarrio