我使用的是通用存储库。我的服务层与我的存储库进行通信,并使用automapper将实体映射到域模型。我的控制器与我的服务层通信,对实体或存储库一无所知。
我正在尝试为所有基本CRUD创建一个通用服务类。
我的通用服务看起来像这样(缩减):
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)); }
}
我的学生服务:
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;
}
}
我的控制器
public class StudentController
{
private readonly IStudentService _studentService;
public StudentController(IStudentService studentService)
{
_studentService = studentService;
}
public ActionResult AddStudent(Student model)
{
_studentService.Add(model); //ERROR
}
}
从控制器调用add时,我得到以下内容(上面标有ERROR的行)。
The type is defined in an assembly that is not referenced. You must add a reference to MyProject.Entities
我理解错误的原因但不认为这会是一个问题,因为我的服务仅接受并返回模型并且不需要了解实体?
是否有其他方法可以实现我想要的功能,这样我就可以避免在控制器类中引用实体了?
答案 0 :(得分:0)
为了完整起见,我应该把它作为答案。
只需更改服务界面,不要采用实体类型参数:
public interface IService<TModel> {
// ...
}
并将type参数保留在抽象类中。
public abstract class Service<TModel, TEntity> : IService<TModel> {
// ...
}