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
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.
@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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With