我正在尝试使用LightInject在我的应用程序中注册我的泛型类。我无法弄清楚这样做的语法或方法;
这是我的通用存储库接口:
public interface IGenericRepository<T> : IDisposable where T : class
{
IQueryable<T> GetAll();
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
void Add(T entity);
void Delete(T entity);
void Edit(T entity);
void Save();
}
以下是实施的片段:
public abstract class GenericRepository<C, T> : IGenericRepository<T> where T : class where C : DbContext, new()
{
private C _entities = new C();
protected C Context
{
get { return _entities; }
set { _entities = value; }
}
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>();
return query;
}
public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
IQueryable<T> query = _entities.Set<T>().Where(predicate);
return query;
}
}
我在这里注册项目:
serviceRegistry.Register<IUserRepository, IUserRepository>(new PerRequestLifeTime());
serviceRegistry.Register<IUserManager, UserManager>(new PerRequestLifeTime());
实现:
public interface IUserRepository : IGenericRepository<User>
{
User GetSingle(int userId);
}
来自管制员的Aaaand:
public class UserController : ApiController
{
private readonly IUserManager _userManager;
public UserController(IUserManager userManager)
{
_userManager = userManager;
}
[SwaggerResponse(HttpStatusCode.OK, "Gets a user", typeof(bool))]
[SwaggerResponse(HttpStatusCode.InternalServerError, "Error obtaining user")]
[SwaggerResponse(HttpStatusCode.BadRequest, "Invalid request, eg. Invalid user given")]
[VersionedRoute("api/user/{userId}/", 1, Name = "GetTestV1"), HttpGet]
public IHttpActionResult GetUserSingle(int userId)
{
try
{
if (userId == default(long))
{
return BadRequest("Please provide userId");
}
var result = _userManager.GetUserSingle(userId);
return Ok(result);
}
catch (Exception ex)
{
//_logger.Error($"Failed to process calculation request", ex);
return InternalServerError(ex);
}
}
}
但是,当调用使用这些接口的Controller时,它会抛出错误。我认为我需要在某种程度上注册那个通用控制器...只是不确定语法 - 其他人遇到过这个?似乎是GenericRepository的一个特定实现,因为它接受C和T,LightInject可能不支持...
我在课程注册时尝试了以下内容;
container.Register<IGenericRepository<User>, IUserRepository>(new PerRequestLifeTime());
container.Register<IUserManager, UserManager>(new PerRequestLifeTime());
container.Register<IGenericRepository<User>, GenericRepository<AuthContext, User>>(new PerRequestLifeTime());
container.Register(
factory => new UserManager(
container.GetInstance<IUserRepository>()), new PerRequestLifeTime());
container.Register(
factory => new UserController(
container.GetInstance<IUserManager>()), new PerRequestLifeTime());
但我还是得到了:
"ExceptionMessage": "Unresolved dependency [Target Type: Business.UserManager], [Parameter: userRepo(DataAccess.IUserRepository)], [Requested dependency: ServiceType:DataAccess.IUserRepository, ServiceName:]",