Autofac - auto registration error : No constructors can be found with 'Public binding flags'
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.
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, 2020Comments
-
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 over 8 yearsDurr--this made me feel a bit less intelligent :).
-
craftworkgames about 7 yearsGah! So obvious once you spot it.