2009-08-24 8 views
2

A ce moment, j'ai ce code pour ma classe "employee". Mais j'ai presque la même chose pour "client" et tous les autres.Class, Interface, Generics .... besoin de simplification

Y at-il un moyen de créer un équivalent de ma classe « EmployeeRepository » mais plus quelque chose comme ça myrepo < employé > mais mettre en œuvre IEmployeeRepository dans ce cas, ICustomerRepository si je fais ce myrepo <Client>. Bien sûr, la méthode get retour des employés, clients ou autres ...

public class EmployeeRepository : NHRepository<Employee>, IEmployeeRepository 
{ 
    public Employee Get(Guid EmployeeId) 
    { 
     return base.Get(EmployeeId); 
    } 
} 

public interface IEmployeeRepository : IRepositoryActionActor<Employee> 
{ 

} 

public interface IRepositoryActionActor<T> 
{ 
    T Get(Guid objId); 
} 

Répondre

2

Oui, comme Spencer Ruport déjà mentionné, rassemblez votre code dans une interface ou une classe de base abstraite comme je l'ai fait:

public interface IPerson 
{ 
    void DoSomething(); 
} 

public abstract class Person : IPerson 
{ 

    public virtual void DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class Employee : Person 
{ 
    public override void DoSomething() 
    { 
     base.DoSomething(); 
     /* Put additional code here */ 
    } 
} 

public class Customer : Person { } 

public class PersonRepository<T> : System.Collections.Generic.List<T> where T : IPerson, new() 
{ 
    public T Get(Guid id) 
    { 
     IPerson person = new T(); 
     return (T)person; 
    } 
} 
+0

Interface nécessaire, j'utilise IoC –

+0

Je ne peux pas éditer mais il y a une erreur de syntaxe dans le code, si vous pouvez corriger. Mais c'est du travail. Merci encore –

1

Vous pouvez - sauf vous rendre l'interface générique IEmployeeRepository aussi bien, de sorte que vous auriez:

public class MyRepo<U> : NHRepository<U>, IRepository<U> 
{ 
... 

} 

public interface IRepository<T> : IRepositoryActionActor<T> 
{ 

} 

public interface IRepositoryActionActor<T> 
{ 
    T Get(Guid objId); 
} 

espoir qui aide :)

+0

Est-il possible dans "interface publique IRepository : IRepositoryActionActor " pour ajouter une méthode pour mettre en œuvre en fonction de la valeur T? –

1

À ce moment, j'ai ce code de pour ma classe «employé». Mais j'ai ont presque la même chose pour "client" et tous les autres.

Déterminez ce qu'ils ont en commun et donnez un nom à cet ensemble de données et créez une interface pour celui-ci. Je pense que IPerson fonctionnerait probablement.

Ensuite, vous pouvez créer un référentiel get person qui renvoie un objet IPerson et peut être un employé ou un client.

+0

IRepositoryActionActor est commun à tous (Employé, Client, ....) mais IEmployeeRepository (ICustomerRepository, ...) ajoute une déclaration spécifique –