I did everything exactly according to the instructions , but for some reason nothing works

namespace API.App_Start { public static class UnityConfig { public static void Configuration(HttpConfiguration config) { var container = new UnityContainer(); RegisterTypes(container); config.DependencyResolver = new UnityResolver(container); } private static void RegisterTypes(IUnityContainer container) { container.RegisterType<IContext, QueueDB>(new HierarchicalLifetimeManager()); container.RegisterType<IQueueRepository, QueueRepository>(new HierarchicalLifetimeManager()); container.RegisterType<IUserRepository, UserRepository>(new HierarchicalLifetimeManager()); } } } namespace API.Infrastructure { public class UnityResolver : IDependencyResolver { protected IUnityContainer container; public UnityResolver(IUnityContainer container) { if (container == null) { throw new ArgumentNullException("container"); } this.container = container; } public object GetService(Type serviceType) { try { return container.Resolve(serviceType); } catch (ResolutionFailedException) { return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return container.ResolveAll(serviceType); } catch (ResolutionFailedException) { return new List<object>(); } } public IDependencyScope BeginScope() { var child = container.CreateChildContainer(); return new UnityResolver(child); } public void Dispose() { container.Dispose(); } } } 

here is the controller itself:

  [RoutePrefix("api/queue")] public class QueueController : ApiController { private IQueueRepository _queueRepository; public QueueController(IQueueRepository queueRepository) { _queueRepository = queueRepository; } [HttpPost] public void CreateQueue(QueueModel model) { Queue newQueue = model; _queueRepository.AddQueue(newQueue); } [HttpPost] public bool AddUser(int UserId, int QueueId) { DataAccessResult result = _queueRepository.AddUserInQueue( UserId, QueueId ); return result.IsComplate; } [HttpGet] public IEnumerable<Queue> GetQueues() { return _queueRepository.GetAllQueue(); } [HttpDelete] public bool DeleteUser(int UserId, int QueueId) { DataAccessResult result = _queueRepository.DeleteUserFromQueue( UserId, QueueId ); return result.IsComplate; } [HttpGet] public Queue GetQueue(int queueId) { DataAccessResult<Queue> result = new DataAccessResult<Queue>(); return result.Value; } [HttpDelete] public bool Delete(int queueId) { DataAccessResult result = _queueRepository.DeleteQueue(queueId); return result.IsComplate; } } 

His repository:

 public class QueueRepository : BaseRepository, IQueueRepository { public QueueRepository(IContext context, ILogger logger ) : base(context, logger) { } public DataAccessResult AddUserInQueue(int userId, int queueId) { DataAccessResult result = new DataAccessResult(); DataAccessResult<User> userResult = this.GetUserById(userId); DataAccessResult<Queue> queueResult = this.GetQueueById(queueId); if (!userResult.IsComplate || !queueResult.IsComplate) { result.IsComplate = false; result.Message = string.Format("{0} {1}", userResult.Message, queueResult.Message); return result; } else { result.IsComplate = true; } UserState state = new UserState { Queue = queueResult.Value, User = userResult.Value }; _context.States.Add(state); if (this.SaveChange()) { _logger.Write(string.Format("Add User (Id:{0}) to Queue (Id{1})", userId, queueId), LogEventLevel.Information); } else { result.IsComplate = false; } return result; } public ICollection<Queue> GetAllQueue() { return _context.Queues.ToList(); } public void AddQueue(Queue queue) { _context.Queues.Add(queue); if (this.SaveChange()) { _logger.Write(string.Format("Create new Queue (Id:{0}, Name:{1})", queue.Id, queue.Name), LogEventLevel.Information); } } public DataAccessResult EditQueue(Queue edit) { DataAccessResult result = new DataAccessResult(); _context.Update(edit); if (this.SaveChange()) { result.IsComplate = true; _logger.Write(string.Format("Edited Queue(id:{0})", edit.Id), LogEventLevel.Information); } else { result.IsComplate = false; result.Message = "Saving error"; } return result; } public DataAccessResult DeleteQueue(int queueId) { DataAccessResult<Queue> queueResult = this.GetQueueById(queueId); DataAccessResult result = new DataAccessResult(); if (!queueResult.IsComplate) { result.IsComplate = false; result.Message = result.Message; return result; } else { result.IsComplate = true; } _context.Delete(queueResult.Value); if (this.SaveChange()) { _logger.Write(string.Format("Deleted Queue (Id:{0}, Name:{1})", queueId, queueResult.Value.Name), LogEventLevel.Information); } else { result.IsComplate = false; } return result; } public DataAccessResult DeleteUserFromQueue(int userId, int queueId) { DataAccessResult result = new DataAccessResult(); DataAccessResult<User> userResult = this.GetUserById(userId); DataAccessResult<Queue> queueResult = this.GetQueueById(queueId); if (!userResult.IsComplate || !queueResult.IsComplate) { result.IsComplate = false; result.Message = string.Format("{0} {1}", userResult.Message, queueResult.Message); return result; } else { result.IsComplate = true; } Queue queue = queueResult.Value; User user = userResult.Value; UserState state = user.States.FirstOrDefault(s => s.Queue.Equals(queue)); if (state == null) { result.IsComplate = false; result.Message = string.Format("User (FirstName: {0}, SecondName{1} ,Id:{2}) not a member Queue (id: {3})", user.FirstName, user.SecondName, user.Id, queue.Id); _logger.Write(result.Message, LogEventLevel.Error); return result; } else { result.IsComplate = true; _context.Delete(state); if (this.SaveChange()) { _logger.Write(string.Format("Deleted User(Id:{0}, FirstName:{1}, SecondName:{2}) from Queue(Id:{3})", user.Id, user.FirstName, user.SecondName, queue.Id), LogEventLevel.Information); } else { result.IsComplate = false; } return result; } } } 

And the repository context:

 public class QueueDB : DbContext, IContext { public DbSet<User> Users { get; set; } public DbSet<UserState> States { get; set; } public DbSet<Queue> Queues { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<User>() .HasMany(u => u.States) .WithOptional(s => s.User); modelBuilder.Entity<Queue>() .HasMany(q => q.States) .WithOptional(s => s.Queue); modelBuilder.Entity<Queue>() .HasRequired(q => q.Admin) .WithMany(u => u.Adminstrational); } public void Delete<T>(T entry) where T : class { this.Entry(entry).State = EntityState.Deleted; } public void Update<T>(T entry) where T : class { this.Entry(entry).State = EntityState.Modified; } } 

The fact is that when accessing this controller, the injection does not work, and throws an error:

 <Error> <Message>Произошла ошибка.</Message> <ExceptionMessage> Произошла ошибка при попытке создать контроллер типа "QueueController". Убедитесь в том, что контроллер имеет общедоступный конструктор без параметров. </ExceptionMessage> <ExceptionType>System.InvalidOperationException</ExceptionType> <StackTrace> в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) в System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) в System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext() </StackTrace> <InnerException> <Message>Произошла ошибка.</Message> <ExceptionMessage> Тип "API.Controllers.QueueController" не содержит конструктор по умолчанию </ExceptionMessage> <ExceptionType>System.ArgumentException</ExceptionType> <StackTrace> в System.Linq.Expressions.Expression.New(Type type) в System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) </StackTrace> </InnerException> </Error> 

In the project Global.asax replaced by Startup.cs

  • The error indicates the reason: your class has no constructor with no parameters. Apparently you need to announce it. - Maxim Timakov

1 answer 1

I can be wrong, but try registering an ILogger implementation in the container, because an instance of QueueRepository and, therefore, QueueController cannot be created without it.