2012-06-10 16 views
11

で見つからないことができますこれは私のGlobal.asax.cs Autofac - 自動登録エラー:」タイプの ないコンストラクタ:いいえコンストラクタ「が公開バインディングフラグ」

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

、私は次のエラーを抱えていますAppBase.Service.UserService 'は' Public binding flags 'で見つけることができます。

リポジトリとサービスの実装済みインタフェースを登録しましたが、どこが間違っていましたか?それは次のように壊れます。

これは私の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 ... 

} 

ですこれは私のエラーです:

[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 

答えて

32

私はUserServiceがプライベートコンストラクタを持っている理由はわかりません。これには理由がありますか?

コンストラクタを定義すると、デフォルトコンストラクタpublic UserService()は生成されなくなりました。

Autofacは、公開されているコンストラクタにのみ注入します。あなたがそれを公開に変更するとうまくいくはずです。

+0

これは見落とされている...真剣に、ありがとう! – NicoJuicy

+0

Durr - これはちょっと賢明ではない気がしました:) – slashp

+0

ガー!一度それを見つけたら明らかです。 – craftworkgames

2

@HackedByChinese回答が正しいです。

私は私のサービスレイヤの抽象クラスでクラスを作ることを再シャープに提案しました。これにより、既定のパブリックコンストラクターが生成されなくなります。これは私が少し悩まされたので、他人を助けるかもしれないと思った。

関連する問題