从成员资格提供程序解析值的错误

时间:2013-06-25 02:00:32

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我尝试使用成员资格提供程序和存储库类创建登录系统 当我尝试将值从我的成员类传递到我的存储库类时,值可以传递..

我的代码有什么问题?

namespace XNet.Services
{
    public class MembershipProviderService:IMembershipProviderService
    {
        IEntityRepository<User> _UserRepository;

        public MembershipProviderService(IEntityRepository<User> _UserRepository)
        {
            this._UserRepository = _UserRepository;
        }
        public MembershipProviderService()
        {

        }
        public User GetDataLogin(string UserName, string Password)
        {
            //List<User> GetData = _UserRepository.AsQueryable().Where(x => x.UserName == UserName && x.UserPassword == Password).ToList();
            var x = (from d in _UserRepository.All()
                     where d.UserName == UserName && d.UserPassword == Password
                     select d).FirstOrDefault();
            return x;
        }

    }
}

XnetMembership

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Security;
using XNet.Interfaces;
using XNet.Repository.Interfaces;
using XNet.Repository.Model;
using XNet.Services;
using Ninject;

namespace XNet.Security
{
    public class XNetMembership : MembershipProvider
    {
        [Inject]
        public IMembershipProviderService _membershipProviderService { get; set; }
        //private readonly IMembershipProviderService _membershipProviderService;

        //public XNetMembership()
        //{

        //}

        //public XNetMembership(IMembershipProviderService membershipProviderService)
        //{
        //    _membershipProviderService = membershipProviderService;
        //}



        public override string ApplicationName
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public override bool ChangePassword(string username, string oldPassword, string newPassword)
        {
            throw new NotImplementedException();
        }

        public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            throw new NotImplementedException();
        }

        public override bool DeleteUser(string username, bool deleteAllRelatedData)
        {
            throw new NotImplementedException();
        }

        public override bool EnablePasswordReset
        {
            get { throw new NotImplementedException(); }
        }

        public override bool EnablePasswordRetrieval
        {
            get { throw new NotImplementedException(); }
        }

        public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override int GetNumberOfUsersOnline()
        {
            throw new NotImplementedException();
        }

        public override string GetPassword(string username, string answer)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
        {
            throw new NotImplementedException();
        }

        public override string GetUserNameByEmail(string email)
        {
            throw new NotImplementedException();
        }

        public override int MaxInvalidPasswordAttempts
        {
            get { throw new NotImplementedException(); }
        }

        public override int MinRequiredNonAlphanumericCharacters
        {
            get { throw new NotImplementedException(); }
        }

        public override int MinRequiredPasswordLength
        {
            get { throw new NotImplementedException(); }
        }

        public override int PasswordAttemptWindow
        {
            get { throw new NotImplementedException(); }
        }

        public override MembershipPasswordFormat PasswordFormat
        {
            get { throw new NotImplementedException(); }
        }

        public override string PasswordStrengthRegularExpression
        {
            get { throw new NotImplementedException(); }
        }

        public override bool RequiresQuestionAndAnswer
        {
            get { throw new NotImplementedException(); }
        }

        public override bool RequiresUniqueEmail
        {
            get { throw new NotImplementedException(); }
        }

        public override string ResetPassword(string username, string answer)
        {
            throw new NotImplementedException();
        }

        public override bool UnlockUser(string userName)
        {
            throw new NotImplementedException();
        }

        public override void UpdateUser(MembershipUser user)
        {
            throw new NotImplementedException();
        }

        public override bool ValidateUser(string username, string password)
        {

            var x = _membershipProviderService.GetDataLogin(username, password);
            return true;
            //if (x.Count() > 0)
            //{
            //    FormsAuthentication.SetAuthCookie(username, true);
            //    return true;
            //}
            //else
            //{
            //    return false;
            //}
        }

    }
}

IXNetMembershipService

namespace XNet.Interfaces
{
    public interface IMembershipProviderService
    {
        User GetDataLogin(string UserName, string Password);
    }
}

我的控制器

public ActionResult Login()
{
    return View();
}

[HttpPost]
public ActionResult Login(User user)
{
    if (Membership.ValidateUser(user.UserName, user.UserPassword))
    {
        return RedirectToAction("Index");
    }

    return View(user);
}

Global asx

namespace XNet.WebUI.Hotel
{

    public class NinjectDenpendencyResolver : IDependencyResolver
    {
        private readonly IResolutionRoot _resolutionRoot;

        public NinjectDenpendencyResolver(IResolutionRoot kernel)
        {
            _resolutionRoot = kernel;
        }

        public object GetService(Type serviceType)
        {
            return _resolutionRoot.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return _resolutionRoot.GetAll(serviceType);
        }

    }

    internal class MyNinjectModules : NinjectModule
    {
        public override void Load()
        {
            Bind<IMembershipProviderService>()
                .To<MembershipProviderService>();
        }
    }


    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
    public class MvcApplication : System.Web.HttpApplication
    {
        private IKernel _kernel = new StandardKernel(new MyNinjectModules());

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            _kernel.Inject(Membership.Provider);
        }
    }
}

NinjectWebCommon

[assembly: WebActivator.PreApplicationStartMethod(typeof(XNet.WebUI.Hotel.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(XNet.WebUI.Hotel.App_Start.NinjectWebCommon), "Stop")]

namespace XNet.WebUI.Hotel.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;
    using XNet.Services;
    using XNet.Interfaces;
    using XNet.Repository;
    using XNet.Repository.Interfaces;
    using XNet.Repository.Model;
    using XNet.Repository.Repositories;
    using XNet.Pipelines;
    using System.Web.Security;

    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {

            EF_RepoRegistration.RegisterRepository(kernel);
            kernel.Bind<IHotelService>().To<HotelService>().InRequestScope();
            //kernel.Bind<IFacilityService>().To<FacilityService>().InRequestScope();
            //kernel.Bind<IHotelFacilityService>().To<HotelFacilityService>().InRequestScope();
            //kernel.Bind<IHotelRoomFacilityService>().To<HotelRoomFacilityService>().InRequestScope();
            kernel.Bind<IRoomTypeService>().To<RoomTypeService>().InRequestScope();
            kernel.Bind<IRoomFacilityService>().To<RoomFacilityService>().InRequestScope();
            kernel.Bind<IRoomTypePipeline>().To<RoomTypePipeline>().InRequestScope();
            kernel.Bind<IAccountService>().To<AccountService>().InRequestScope();
            kernel.Bind<IMembershipProviderService>().To<MembershipProviderService>().InRequestScope();

        }        
    }
}

2 个答案:

答案 0 :(得分:0)

如果在ValidateUser中遇到NullReferenceException,我猜_membershipProviderService为null。你能核实吗?如果是这样,我猜测问题是默认构造函数没有实例化_membershipProviderService。

你需要这样的东西:

public XNetMembership() : 
   this(new XNetMembershipProvider())
{

}

答案 1 :(得分:0)

我的猜测是这条线路失败了:

var x = _membershipProviderService.GetDataLogin(username, password);

在这里放置一个断点,看看_membershipProviderService的值是什么。它是空的吗?那是你的问题。

看起来您的问题与您的评论中的Ninject相关。

Ninject不应仅限于您的控制器。如果您有一个依赖于存储库的服务,为什么不在那里使用Ninject?它的工作原理与控制器完全相同。然后你可以轻松测试。

要解决此问题,您需要对您的成员资格提供程序执行相同的操作,以便像控制器一样连接依赖项。我不熟悉Ninject,但是你可能在某个配置文件或属性中缺少绑定?

类似的东西:

kernel.Bind<IMembershipProviderService >().To<MyAwesomeMembershipProviderService>();