【发布时间】:2017-10-04 00:47:05
【问题描述】:
我尝试为 ms sql db 创建通用存储库。早些时候我使用过类似的东西,但使用的是 mongo db。我可以编译项目。但是当我尝试发送请求时,我看到错误:“尝试创建'EmployeeController'类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。”有人可以帮帮我吗?
namespace TestTask.Util
{public class NinjectDependencyResolver
{
private IKernel kernel;
public NinjectDependencyResolver(IKernel kernelParam)
{
kernel = kernelParam;
AddBindings();
}
public object GetService(Type serviceType)
{
return kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.GetAll(serviceType);
}
private void AddBindings()
{
// repository
kernel.Bind<IEmployeeRepository>().To<EmployeeRepository>();
}
}
控制器
namespace TestTask.Controllers
{
[RoutePrefix("api/v1")]
public class EmployeeController : ApiController
{
private readonly IEmployeeRepository _employeeRepository;
public EmployeeController(IEmployeeRepository employeeRepository) : base()
{
_employeeRepository = employeeRepository;
}
[HttpGet]
[Route("getItems")]
public IHttpActionResult GetItems(int take = 8, int skip = 0)
{
if(take<1|| skip < 0)
{
ModelState.AddModelError("Error", "Invalid take or skip params.");
return BadRequest(ModelState);
}
var result = _employeeRepository.Find(x => x.Id >= 0, x=>x.Id, take, skip);
return Ok(result);
}
[HttpGet]
[Route("pageCount")]
public IHttpActionResult PageCount(int itemsInPage)
{
var TotalCount = _employeeRepository.Count(x => x.Id >= 0);
var result = Math.Ceiling((double)TotalCount / (double)itemsInPage);
return Ok(result);
}
}
}
通用存储库
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using System.Web;
namespace TestTask.Context
{
public abstract class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
private DefaultConnection context = new DefaultConnection();
public virtual List<TEntity> Find(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, object>> order, int take =50, int skip=0) //where TEntity : class
{
return context.Set<TEntity>().Where(predicate).OrderBy(order).Skip(skip).Take(take).ToList();
}
public virtual int Count(Expression<Func<TEntity, bool>> predicate)
{
return context.Set<TEntity>().Where(predicate).Count();
}
}
}
【问题讨论】:
-
正如错误所说,转到
Employee Controller并确保有public EmployeeController() : base() { } -
@VovaLeskiv 框架在创建控制器时遇到问题。最有可能与解决依赖关系有关。从设置来看,
EmployeeRepository在初始化时可能缺少依赖项或其他问题,但您没有显示该类 -
当我尝试添加没有参数的空构造函数时,调试器转到方法但不能使用 _employeeRepository 并显示 argumentNullException
-
@VovaLeskiv 您的依赖解析器也没有从正确的接口继承。您需要在minimal reproducible example 中提供模式详细信息
-
Nkosi,EmployeeRepository 为空,从通用存储库继承两个方法
标签: c# asp.net asp.net-web-api dependency-injection