我有一个自定义MembershipProvider类,它继承自MembershipProvider,它带有两个参数:
public class CustomMembershipProvider : MembershipProvider { private readonly ISecurityRepository _securityRepository; private readonly IUserRepository _userRepository; public CustomMembershipProvider(ISecurityRepository securityRepository, IUserRepository userRepository) { ... } public override MembershipUser GetUser(string username, bool userIsOnline) { ... } ... etc }
这个配置文件看起来类似于:
这在我的Web应用程序中主要用于登录和注销.我正在使用Unity for DI并在我的Boostrapper.cs类中设置必要的类.
但是,当我想创建一个自定义User类并调用Membership.GetUser方法时,我最近遇到了一个问题.当我这样做时,我得到以下异常:
{"No parameterless constructor defined for this object. (C:\\*app path*\\web.config line 43)"}
我的配置文件中的第43行指向我上面发布的自定义成员资格提供程序.我认为在其他地方,应用程序使用Unity来解析这些参数,但是在使用Membership类时却没有.
有什么办法可以告诉应用程序如何解决这些依赖关系,或者如果没有办法在不使用具体实现的情况下将这些依赖关系添加到我的成员资格提供程序中?
编辑1:
这是自定义User类:
public class User : MembershipUser { public int UserId { get; set; } public string Username { get; set; } public string Email { get; set; } public DateTime LastLoggedOnDate { get; set; } ... }
编辑2:
在我的自定义成员资格提供程序类中,这就是GetUser方法的样子:
public override MembershipUser GetUser(string username, bool userIsOnline) { return _userRepository.GetUser(username); }
lopezbertoni.. 6
问题是您无法通过构造函数注入Membership提供程序.请参阅此问题
我使用Ninject实现了自定义成员资格提供程序,并使用ServiceLocator获取服务实例.
public class AccountMembershipProvider : MembershipProvider { private readonly IUsers _users; public AccountMembershipProvider() { _users = ServiceLocator.Current.GetInstance(); } public override bool ValidateUser(string username, string password) { return _users.IsValidLogin(username, password); } ... }
在您的情况下,您需要获取IUserRepository和ISecurityRepository.
连接接口/服务时
private static void RegisterServices(IKernel kernel) { kernel.Bind().To (); kernel.Bind ().To (); kernel.Bind ().To ().InRequestScope(); kernel.Bind ().To ().InRequestScope(); }
你可以在这里查看一个完整的工作示例(使用Ninject但你可以将它改编为Unity):https://github.com/lopezbertoni/SampleApp
希望这可以帮助,
问题是您无法通过构造函数注入Membership提供程序.请参阅此问题
我使用Ninject实现了自定义成员资格提供程序,并使用ServiceLocator获取服务实例.
public class AccountMembershipProvider : MembershipProvider { private readonly IUsers _users; public AccountMembershipProvider() { _users = ServiceLocator.Current.GetInstance<IUsers>(); } public override bool ValidateUser(string username, string password) { return _users.IsValidLogin(username, password); } ... }
在您的情况下,您需要获取IUserRepository和ISecurityRepository.
连接接口/服务时
private static void RegisterServices(IKernel kernel) { kernel.Bind<IUsers>().To<UsersService>(); kernel.Bind<IRoles>().To<RolesService>(); kernel.Bind<MembershipProvider>().To<AccountMembershipProvider>().InRequestScope(); kernel.Bind<RoleProvider>().To<AccountRoleProvider>().InRequestScope(); }
你可以在这里查看一个完整的工作示例(使用Ninject但你可以将它改编为Unity):https://github.com/lopezbertoni/SampleApp
希望这可以帮助,