该类型在未引用的程序集中定义。 c#,通用存储库模式,URF

时间:2016-04-04 02:42:39

标签: c# entity-framework generics repository-pattern

我使用的是通用存储库。我的服务层与我的存储库进行通信,并使用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

我理解错误的原因但不认为这会是一个问题,因为我的服务仅接受并返回模型并且不需要了解实体?

是否有其他方法可以实现我想要的功能,这样我就可以避免在控制器类中引用实体了?

1 个答案:

答案 0 :(得分:0)

为了完整起见,我应该把它作为答案。

只需更改服务界面,不要采用实体类型参数:

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

并将type参数保留在抽象类中。

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