Autofac - auto registration error : No constructors can be found with 'Public binding flags'

20,738

Solution 1

I'm not sure why UserService has a private constructor. Is there a reason for this?

By defining a constructor, the default constructor public UserService() is no longer generated.

Autofac will only inject into public constructors, of which you now have none. It should work if you change it to public.

Solution 2

@HackedByChinese answer is correct.

Re-sharper suggested that I make a class in my service layer abstract. This also prevents a default public constructor from being generated. This bugged me for a little bit so I thought it might help someone else.

Share:
20,738
NicoJuicy
Author by

NicoJuicy

I'm a developer with much interest in different technologies (RoR/Python/C#(code-first/ef,...) Mostly in .Net (= work-related), anything else ( www.sapico.me )

Updated on January 18, 2020

Comments

  • NicoJuicy
    NicoJuicy over 4 years

    This is my Global.asax.cs

    public void RegisterContainersUsingAutofac()
        {
            //http://elegantcode.com/2009/01/07/ioc-libraries-compared/
            //http://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac
            //https://code.google.com/p/autofac/
            //http://api.autofac.org/
            var builder = new ContainerBuilder();
            builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
            builder.RegisterModelBinderProvider();
            //builder.RegisterType<AuthenticationService>().As<IAuthenticationService>();
            builder.RegisterControllers(typeof(MvcApplication).Assembly);
    
            //builder.RegisterAssemblyTypes(typeof(SecurityService).Assembly).
            //      Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest();
            builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork)).InstancePerLifetimeScope()
                .OnRelease(x =>{((IUnitOfWork)x).Commit();});
    
            builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
            builder.RegisterAssemblyTypes(typeof(SecurityService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();
    
            IContainer container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    

    And i'm having the following error: No constructors on type 'AppBase.Service.UserService' can be found with 'Public binding flags'.

    I registered my implemented interfaces of repositories and services, but where did i go wrong? It breaks at the following.

    This is my userService

     public interface IUserService
    {
        int Login(string userNameOrEmail, string password, out int errorcode, out int timeout);
        bool Register(string userName, string password, string email, string country, string language, out int errorCode);
    
        bool Register(User user, out int errorCode);
        bool ResetPassword(string username, string email, string oldPassword, string newPassword, out int errorCode);
    
        void DeleteUser(string userName);
    }
    public class UserService : IUserService
    {
          private readonly IUserRepository userRepository;
         private UserService(IUserRepository _userRepository)
        {
            userRepository = _userRepository;
    
        }
        //other methods ...
    
    }
    

    This is my error:

     [DependencyResolutionException: No constructors on type 'AppBase.Service.UserService' can be found with 'Public binding flags'.]
     Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) +261
     Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) +91
     Autofac.Core.Resolving.InstanceLookup.Execute() +135
     Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +434
     Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +61
     Autofac.Core.Activators.Reflection.<>c__DisplayClass2.<CanSupplyValue>b__0() +68
     Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() +201
                 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) +499
     Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) +91
     Autofac.Core.Resolving.InstanceLookup.Execute() +135
     Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +434
     Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +52
     Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters) +115
     Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +300
     Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) +103
     Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters) +218
     Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters) +64
     Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType) +43
     Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(Type serviceType) +49
     System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +51
    
     [InvalidOperationException: An error occurred when trying to create a controller of type 'AppBase.Web.Controllers.AccountController'. Make sure that the controller has a parameterless public constructor.]
     System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182
     System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
     System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
     System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232
     System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49
     System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13
     System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
     System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
      System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124
     System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98
     System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
     System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
     System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8968180
     System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
    
  • cjones26
    cjones26 over 8 years
    Durr--this made me feel a bit less intelligent :).
  • craftworkgames
    craftworkgames about 7 years
    Gah! So obvious once you spot it.