2016-04-04 2 views
1

Ich benutze ein generisches Repository. Meine Service-Schicht redet mit meinem Repository und ordnet Entitäten Domain-Modellen mit Auto-Mapper zu. Meine Controller sprechen mit meiner Serviceebene und wissen nichts über Entitäten oder das Repository.Der Typ wird in einer Baugruppe definiert, auf die nicht verwiesen wird. C#, Generic Repository Pattern, URF

Ich versuche, eine generische Serviceklasse für alle grundlegenden CRUDs zu erstellen.

Mein generic Service sieht wie folgt aus (abgeholzt):

public interface IService<TModel, TEntity> 
{ 
    void Add(TModel model) 
} 

public abstract class Service<TModel, TEntity> : IService<TModel, TEntity> 
{ 
    private readonly IGenericRepository<TEntity> _repository; 

    protected Service(IGenericRepository<TEntity> repository) { _repository = repository; } 

    public virtual void Add(TModel model) { _repository.Add(AutoMapper.Mapper.Map<TEntity>(model)); } 
} 

Mein Studentenservice:

public interface IStudentService : IService<Model.Student, Entity.Student> 
{ } 

public class StudentService : Service<Model.Student, Entity.Student>, IStudentService 
{ 
    private readonly IGenericRepository<Entity.Student> _repository; 

    public StudentService (IGenericRepository<Entity.Student> repository) : base(repository) 
    { 
     _repository = repository; 
    } 
} 

Und mein Controller

public class StudentController 
{ 
    private readonly IStudentService _studentService; 

    public StudentController(IStudentService studentService) 
    { 
     _studentService = studentService; 
    } 

    public ActionResult AddStudent(Student model) 
    { 
     _studentService.Add(model); //ERROR 
    } 
} 

ich folgendes erhalten, wenn hinzufügen Aufruf von meinem Controller (Zeile markiert mit ERROR oben).

The type is defined in an assembly that is not referenced. You must add a reference to MyProject.Entities 

Ich verstehe den Grund für den Fehler aber nicht denken, es wäre ein Problem, als mein Dienst akzeptiert und gibt nur Modelle und muss nicht über Entitäten wissen?

Gibt es eine andere Möglichkeit, um das zu erreichen, was ich will, damit ich nicht auf Entitäten in meiner Controller-Klasse verweisen kann?

+1

Benötigt die Service-Schnittstelle wirklich den Parameter Entitätstyp? Die abstrakte Klasse wird, und das ist in Ordnung, aber in Ihrem Beispiel für das Interface wird es überhaupt nicht verwendet. Außerdem sagen Sie, dass die Clients Ihres Dienstes keine Kenntnis von Entitäten haben, daher ist es nicht wirklich sinnvoll, dass sie in dem Vertrag enthalten sind, den sie verwenden (dh die Schnittstelle). – moreON

+0

müssen Sie eine Projektreferenz hinzufügen, aber Sie müssen keine zusätzlichen Funktionen in Ihrem Controller hinzufügen. – Thomas

+0

@moreON Sie haben Recht. So einfach, ich weiß nicht, wie ich das vermisst habe! – garethb

Antwort

0

Der Vollständigkeit halber sollte ich dies wahrscheinlich als eine Antwort machen.

einfach die Service-Schnittstelle ändert nicht die Entity Typen Parameter zu übernehmen:

public interface IService<TModel> { 
    // ... 
} 

und die Typ-Parameter auf der abstrakten Klasse halten.

public abstract class Service<TModel, TEntity> : IService<TModel> { 
    // ... 
} 
Verwandte Themen