使用Light Inject和存储库模式注册通用类

时间:2018-01-03 09:45:36

标签: c# generics repository-pattern light-inject

我正在尝试使用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:]",

0 个答案:

没有答案