web API DbContext with dependency injection?

raysefo

Well-known member
Joined
Feb 22, 2019
Messages
361
Programming Experience
10+
Hello,
I would like to know how can I use DbContext with dependency injection in my asp.net web api. I am getting Type 'EPINMiddleWareAPI.Controllers.InitiatesController' does not have a default constructor.

Here is my sample code:
C#:
public class EPINMiddleWareAPIContext : DbContext
    {
        
        public EPINMiddleWareAPIContext() : base("name=EPINMiddleWareAPIContext")
        {
        }
    
        public DbSet<InitiateRequest> InitiatesRequests { get; set; }
        public DbSet<InitiateResponse> InitiateResponses { get; set; }
    }

Here is my controller:
C#:
[RoutePrefix("api/v2/pin")]
    public class InitiatesController : ApiController
    {
        private EPINMiddleWareAPIContext context;

        public InitiatesController(EPINMiddleWareAPIContext context)
        {
            this.context = context;
        }


        // POST: api/Game
        [HttpPost, Route("initiation")]
        public async Task<IHttpActionResult> PostInitiate(InitiateRequest initiate)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            context.InitiatesRequests.Add(initiate);
            await context.SaveChangesAsync();

            HttpClient httpClient = new HttpClient();


            HttpContent content = new StringContent(
                JsonConvert.SerializeObject(initiate),
                Encoding.UTF8,
                "application/json"
            );


            HttpResponseMessage response =
                await httpClient.PostAsync("https://test.com/purchaseinitiation", content);

            string htmlResponse = await response.Content.ReadAsStringAsync();

            return Ok(htmlResponse);
        }

        protected override void Dispose(bool disposing)
        {
            context.Dispose();
            base.Dispose(disposing);
        }
    }
 
I am using basic authentication in my API. I use Unity as DI container. I wonder if this registration is enough for User Validation? Or should I add to RegisterType<UnitOfWork>(new HierarchicalLifetimeManager()) it?

C#:
public static class UnityConfig
    {
        #region Unity Container
        private static Lazy<IUnityContainer> container =
          new Lazy<IUnityContainer>(() =>
          {
              var container = new UnityContainer();
              RegisterTypes(container);
              return container;
          });

        /// <summary>
        /// Configured Unity Container.
        /// </summary>
        public static IUnityContainer Container => container.Value;
        #endregion

      
        public static void RegisterTypes(IUnityContainer container)
        {
            
            container.RegisterType<IGameServices, GameServices>().RegisterType<UnitOfWork>(new HierarchicalLifetimeManager());
            container.RegisterType<IUserValidate, UserValidate>();
            
          
        }
    }

Here is User Validate:
C#:
public class UserValidate : IUserValidate
    {
        private readonly UnitOfWork _unitOfWork;

        /// <summary>
        /// Public constructor.
        /// </summary>
        public UserValidate(UnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }

        /// <summary>
        /// Public method to authenticate user by user name and password.
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public async Task<bool> Login(string userName, string password)
        {
            var user = await _unitOfWork.UserRepository.Get(u => u.userName.Equals(userName, StringComparison.OrdinalIgnoreCase) && u.password == password);
            if (user == null) return false;
            return true;
        }
    }
 
Back
Top Bottom