2012-06-10 9 views
11

Ésta es mis Global.asax.csAutofac - error de registro automático: No hay constructores se pueden encontrar con 'banderas de unión Públicos

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)); 
    } 

y estoy teniendo el siguiente error: No hay de constructores el tipo' AppBase.Service.UserService 'se puede encontrar con' Indicadores de enlace público '.

Registré mis interfaces implementadas de repositorios y servicios, pero ¿dónde me salió mal? Se rompe en lo siguiente.

Esta es mi 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 ... 

} 

Ésta es mi 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 

Respuesta

32

No estoy seguro de por qué UserService tiene un constructor privado. ¿Hay alguna razón para esto?

Al definir un constructor, el constructor predeterminado public UserService() ya no se genera.

Autofac solo inyectará en constructores públicos, de los cuales ahora no tiene ninguno. Debería funcionar si lo cambia a público.

+0

Maldición, se pasó por alto que ... En serio, gracias! – NicoJuicy

+0

Durr - esto me hizo sentir un poco menos inteligente :). – slashp

+0

Gah! Tan obvio una vez que lo ves. – craftworkgames

2

@HackedByChinese La respuesta es correcta.

Re-sharper sugirió que haga una clase en el resumen de mi capa de servicio. Esto también evita que se genere un constructor público predeterminado. Esto me molestó un poco, así que pensé que podría ayudar a alguien más.

Cuestiones relacionadas