autofac违反通用约束

时间:2015-04-08 17:44:52

标签: c# generics asp.net-mvc-5 asp.net-web-api2 autofac

我在我的asp.net web api项目中收到此错误,我怀疑是由于我在配置容器时必须犯的一些错误:

  

GenericArguments [0],' Model.AppUser',on' Microsoft.AspNet.Identity.IUserStore`2 [TUser,TKey]'违反了类型参数约束' TUser'。

这是我在startup.cs文件中注册此类型的方法:

builder.RegisterType<UserStore<AppUser>>().As<IUserStore<AppUser, Guid>>().InstancePerRequest();

以下是我的课程:

 public class AppUser : ModelBase, IUser<Guid>
{
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? DOB { get; set; }

    // other fields omitted for brevity ...


    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<AppUser, Guid> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        userIdentity.AddClaim(new Claim(ClaimTypes.Email, this.Email));
        if (!string.IsNullOrWhiteSpace(this.FirstName))
        {
            userIdentity.AddClaim(new Claim(ClaimTypes.GivenName, this.FirstName));
        }
        if (!string.IsNullOrWhiteSpace(this.LastName))
        {
            userIdentity.AddClaim(new Claim(ClaimTypes.Surname, this.LastName));
        }
        return userIdentity;
    }
}


   public class UserStore<TUser> : IUserLoginStore<TUser, Guid>,
                                IUserClaimStore<TUser, Guid>,
                                IUserPasswordStore<TUser, Guid>,
                                IUserSecurityStampStore<TUser, Guid>,
                                IUserEmailStore<TUser, Guid>,
                                IUserPhoneNumberStore<TUser, Guid>,
                                IUserTwoFactorStore<TUser, Guid>,
                                IUserLockoutStore<TUser, Guid>,
                                IUserStore<TUser, Guid>
       where TUser : AppUser
{
    private bool _disposed;
    private readonly IUserRepository _userRepo;
    private readonly IUserClaimRepository _userClaimRepo;
    private readonly IGenericRepository<AppUserLogin, Guid> _userLoginRepo;

    public UserStore(IUserRepository userRepo, IUserClaimRepository userClaimRepo,
                     IGenericRepository<AppUserLogin, Guid> userLoginRepo)
    {
        _userRepo = userRepo;
        _userClaimRepo = userClaimRepo;
        _userLoginRepo = userLoginRepo;
    }

    public Task CreateAsync(TUser user)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }
        _userRepo.Add(user);
        return Task.FromResult<object>(null);
    }

    // other methods omitted for brevity
  }

有趣的是,我注册我的类型的方式在asp.net MVC项目中完美运行,但不是在web api中。我现在收到此错误的原因是我已决定将所有安全问题(即登录,注销,注册等)移至我的网络API层。

到目前为止,谷歌搜索还没有多大帮助。有什么想法吗?

更新1 09/04 12:30 PM GMT - 添加了堆栈跟踪

  

&#39; /&#39;中的服务器错误应用。 GenericArguments [0],   &#39; Model.AppUser&#39;,开启   &#39; Microsoft.AspNet.Identity.IUserStore`2 [TUSER,TKEY的]&#39;违反了   类型参数的约束&#39; TUser&#39;。描述:未处理   在执行当前Web请求期间发生异常。   请查看堆栈跟踪以获取有关错误的更多信息   它起源于代码。

     

异常详细信息:System.TypeLoadException:GenericArguments [0],   &#39; Model.AppUser&#39;,开启   &#39; Microsoft.AspNet.Identity.IUserStore`2 [TUSER,TKEY的]&#39;违反了   类型参数的约束&#39; TUser&#39;。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[TypeLoadException:GenericArguments [0],   &#39; Model.AppUser&#39;,开启   &#39; Microsoft.AspNet.Identity.IUserStore`2 [TUSER,TKEY的]&#39;违反了   类型参数的约束&#39; TUser&#39;。]   System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle句柄,IntPtr *   pInst,Int32 numGenericArgs,ObjectHandleOnStack type)+0
  System.RuntimeTypeHandle.Instantiate(Type [] inst)+94
  System.RuntimeType.MakeGenericType(Type [] instantiation)+209

     

[ArgumentException:GenericArguments [0],   &#39; Model.AppUser&#39;,开启   &#39; Microsoft.AspNet.Identity.IUserStore 2[TUser,TKey]' violates the constraint of type 'TUser'.]
System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e) +4182003
System.RuntimeType.MakeGenericType(Type[] instantiation) +225
Autofac.Features.Variance.<>c__DisplayClass8.<RegistrationsFor>b__2(Type[] a) +13 System.Linq.WhereSelectEnumerableIterator
2.MoveNext()+157   System.Linq.d__14 2.MoveNext() +393
System.Linq.WhereSelectEnumerableIterator
2.MoveNext()+81
  Autofac.Core.Registration.ComponentRegistry.GetInitializedServiceInfo(服务   服务)+268
  Autofac.Core.Registration.ComponentRegistry.RegistrationsFor(服务   服务)+87
  Autofac.Core.Registration.d__a.MoveNext()+301
  Autofac.Core.Registration.ComponentRegistry.GetInitializedServiceInfo(服务   服务)+268
  Autofac.Core.Registration.ComponentRegistry.TryGetRegistration(服务   服务,IComponentRegistration&amp;注册)+82
  Autofac.Core.Activators.Reflection.AutowiringParameter.CanSupplyValue(的ParameterInfo   pi,IComponentContext context,Func 1& valueProvider) +124
Autofac.Core.Activators.Reflection.ConstructorParameterBinding..ctor(ConstructorInfo ci, IEnumerable
1 availableParameters,IComponentContext context)+213   Autofac.Core.Activators.Reflection&LT;&GT; c__DisplayClass5.b__4(ConstructorInfo   ci)+34 System.Linq.WhereSelectArrayIterator 2.MoveNext() +66
System.Linq.WhereEnumerableIterator
1.MoveNext()+85
  System.Linq.Buffer 1..ctor(IEnumerable 1来源)+132
  System.Linq.Enumerable.ToArray(IEnumerable 1 source) +77
Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable
1个参数)+154
  Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1 parameters) +48
Autofac.Core.Resolving.InstanceLookup.<Execute>b__0() +7
Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func
1创作者)+120
  Autofac.Core.Resolving.InstanceLookup.Execute()+132
  Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope   currentOperationScope,IComponentRegistration注册,   IEnumerable 1 parameters) +133
Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable
1个参数)+24
  Autofac.Core.Registration&LT;&GT; c__DisplayClass8.b__3(IComponentContext   c,IEnumerable 1 p) +19
Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable
1个参数)+32
  Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1 parameters) +48 Autofac.Core.Resolving.InstanceLookup.Execute() +48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable 1个参数)+133
  Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration   注册,IEnumerable 1 parameters) +24
Autofac.Core.Activators.Reflection.<>c__DisplayClass2.<CanSupplyValue>b__0() +31 Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() +94 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable
1参数)+185
  Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1 parameters) +48 Autofac.Core.Resolving.InstanceLookup.Execute() +48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable 1个参数)+133
  Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration   注册,IEnumerable 1 parameters) +24
Autofac.Core.Registration.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable
1 p)+19
  Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext   上下文,IEnumerable 1 parameters) +32
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
1   参数)+48 Autofac.Core.Resolving.InstanceLookup.Execute()+48   Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope   currentOperationScope,IComponentRegistration注册,   IEnumerable 1 parameters) +133
Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable
1个参数)+44

     

[DependencyResolutionException:抛出异常时   执行解析操作。有关详细信息,请参阅InnerException。   ---&GT; GenericArguments [0],&#39; Model.AppUser&#39;,on&#39; Microsoft.AspNet.Identity.IUserStore 2[TUser,TKey]' violates the constraint of type 'TUser'. (See inner exception for details.)]
Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable
1个参数)+112
  Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration   注册,IEnumerable 1 parameters) +109
Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable
1个参数,对象&amp;实例)   +74 Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext   上下文,服务服务,IEnumerable`1参数)+53
  Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(类型   serviceType)+59
  System.Web.Mvc.DefaultControllerActivator.Create(的RequestContext   requestContext,Type controllerType)+41

     

[InvalidOperationException:尝试创建时出错   控制器类型&#39; UI.Controllers.AccountController&#39;。使   确保控制器具有无参数的公共构造函数。]
  System.Web.Mvc.DefaultControllerActivator.Create(的RequestContext   requestContext,Type controllerType)+178
  System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(的RequestContext   requestContext,Type controllerType)+77
  System.Web.Mvc.DefaultControllerFactory.CreateController(的RequestContext   requestContext,String controllerName)+88
  Castle.Proxies.Invocations.IControllerFactory_CreateController.InvokeMethodOnTarget()   +118 Castle.DynamicProxy.AbstractInvocation.Proceed()+80 Glimpse.Core.Extensibility.CastleInvocationToAlternateMethodContextAdapter.Proceed()   +11 Glimpse.Core.Extensions.AlternateMethodContextExtensions.TryProceedWithTimer(IAlternateMethodContext   上下文,TimerResult&amp; timerResult)+41
  Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext   上下文)+25
  Glimpse.Core.Extensibility.AlternateTypeToCastleInterceptorAdapter.Intercept(IInvocation   调用)+84 Castle.DynamicProxy.AbstractInvocation.Proceed()   +108 Castle.Proxies.IControllerFactoryProxy.CreateController(RequestContext   requestContext,String controllerName)+214
  System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase   httpContext,IController&amp;控制器,IControllerFactory&amp;厂)   +191 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback回调,对象状态)+50
  System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,   AsyncCallback回调,对象状态)+48
  System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext的   context,AsyncCallback cb,Object extraData)+16
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +301 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+155

0 个答案:

没有答案