2016-04-04 23 views
1

Genel bir depo kullanıyorum. Hizmet katmanım depolamamla ve harita varlıklarıyla otomatik makamlı alan modellerini konuşuyor. Denetleyicilerim hizmet katmanımla konuşuyor ve varlıklardan veya depodan hiçbir şey bilmiyorlar.Tür, başvurulan bir derlemede tanımlanmıştır. C#, Genel Havuz Kalıbı, URF

Tüm temel CRUD'lar için genel bir hizmet sınıfı oluşturmaya çalışıyorum.

Benim jenerik servisi (kesmek) şöyle görünür:

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)); } 
} 

My Öğrenci Servisi: eklemek çağrılırken

public class StudentController 
{ 
    private readonly IStudentService _studentService; 

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

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

aşağıdaki olsun

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; 
    } 
} 

Ve denetleyicisi kontrol cihazımdan (yukarıdaki ERROR ile işaretlenmiş satır).

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

ben hata nedenini anlıyorum ama benim hizmet kabul eder ve sadece modeller döner ve kuruluşlara hakkında bilmek gerekmez gibi bir sorun olacağını düşünmüyordu?

Denetleyicim sınıfımdaki varlıklara başvuruda bulunabilmem için istediğimi gerçekleştirmenin başka bir yolu var mı?

+1

Hizmet Arabirimi gerçekten varlık türü parametresine mi ihtiyaç duyuyor? Soyut sınıf olacak ve bu tamam, ancak Arayüz için örneğinizde hiç kullanılmıyor. Ayrıca, hizmetinizin müşterilerinin varlıkları bilmediğini söylüyorsunuz, bu yüzden kullandıkları sözleşmede (yani, arabirimde) gerçekten bir anlam ifade etmiyor. – moreON

+0

Bir proje referansı eklemeniz gerekecek, ancak kontrol cihazınızda ekstra kullanımlar eklemeniz gerekmeyecek. – Thomas

+0

@moreON Siz haklısınız. Çok basit, bunu nasıl özledim bilmiyorum! – garethb

cevap

0

Tamlık için, muhtemelen bunu bir cevap olarak yapmalıyım.

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

ve soyut sınıfına türü parametresi tutmak:

Sadece Varlık Türü Parametre almamak Servis arayüzünü değiştirin.

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