Entity framework 定制会员服务提供商&;MVC4

Entity framework 定制会员服务提供商&;MVC4,entity-framework,dependency-injection,asp.net-mvc-4,ninject,membership-provider,Entity Framework,Dependency Injection,Asp.net Mvc 4,Ninject,Membership Provider,继续此解决方案: 我宣布 public interface IUserRepository : IRepository<UserModel> { MembershipUser CreateUser(string username, ... , string providername = null); void Logout(); Boolean Login(string userName, string Password, bool persistCookie = false);

继续此解决方案:

我宣布

public interface IUserRepository : IRepository<UserModel>
{
MembershipUser CreateUser(string username, ... , string providername = null);

void Logout();
Boolean Login(string userName, string Password, bool persistCookie = false);
bool RegisterUser(UserModel user);
}

4.Web.config作为

因此,您有CustomMembershipProvider.CreateUser和UserRepository.CreateUser。 您的控制器正在直接调用UserRepository.CreateUser,但我认为您确实想调用CustomMembershipProvider.CreateUser

您的控制器正在呼叫

public bool RegisterUser(UserModel user)
{
    MembershipCreateStatus createStatus;
    CreateUser(user.UserName, user.Password, user.Email, user.PasswordQuestion, user.PasswordAnswer, user.IsApproved, null, out createStatus, ...);
这反过来又在召唤你

public MembershipUser CreateUser(string username, ... , string providername = null)
但是,据我所知,您正在为提供者名称传递NULL

您真正想要的是将其拆分为一个MembershipService,您可以将其注入控制器中


我不能给你一个简单的“改变这一行”的答案,这个问题是概念性的,对不起。您可以传递一个硬编码的providername,但随后确实开始违反所有规则。

在Web.Config中,类似这样的内容。。。。您告诉会员资格提供者和提供者使用。 在本例中,您的自定义提供程序。 但是我不知道为什么ninject在这个概念中扮演了一个角色,所以在这方面我无能为力。 客户提供商必须知道自己的名称。但这几乎不是问题。 Web.config具有自定义提供程序的名称。所以配置不是硬编码的

 <membership defaultProvider="YourProvider" userIsOnlineTimeWindow="5">
  <providers>
    <!--attribute names in camelCase version of .net class MembershipProvider Properties. http://msdn.microsoft.com/en-us/library/system.web.security.membership_properties
    See BOS class for constants : BOSSysConst 
        type = Implmenting provider class  namespace.Classname 
    How to configure membership providers...    http://msdn.microsoft.com/en-us/library/6e9y4s5t -->
    <add name="YourProvider" 
         type="YourNamespace.YourProvider"     
         connectionStringName="YourConnectionString"
         enablePasswordRetrieval="false"
         enablePasswordReset="true"
         requiresQuestionAndAnswer="true"
         passwordFormat="Hashed"
         applicationName="IMPORTANT" />
  </providers>
</membership>

我已经将
IUserRepository
注入控制器,并通过
Ninject
对其进行配置。那么我还需要配置什么?我想你是想调用CustomMembershipProvider.CreateUser。但实际上您是直接调用UserRepository.CreateUser,根本不涉及CustomMembershipProvider。我猜UserRepository本身不知道Membership.Provider.Name。我真希望能给你一个简单的答案,但问题不在于语法,而在于概念。不幸的是,我最好的建议是,回到绘图板上,花更多的时间阅读整个会员资格提供商的事情,以及如何定制。不幸的是,这是一个复杂的问题,需要相当多的时间才能理解。真的很抱歉我帮不了你。我使用依赖注入(IOC),这就是为什么
 kernel.Bind<IUserRepository>().To<UserRepository>();
public bool RegisterUser(UserModel user)
{
    MembershipCreateStatus createStatus;
    CreateUser(user.UserName, user.Password, user.Email, user.PasswordQuestion, user.PasswordAnswer, user.IsApproved, null, out createStatus, ...);
public MembershipUser CreateUser(string username, ... , string providername = null)
 <membership defaultProvider="YourProvider" userIsOnlineTimeWindow="5">
  <providers>
    <!--attribute names in camelCase version of .net class MembershipProvider Properties. http://msdn.microsoft.com/en-us/library/system.web.security.membership_properties
    See BOS class for constants : BOSSysConst 
        type = Implmenting provider class  namespace.Classname 
    How to configure membership providers...    http://msdn.microsoft.com/en-us/library/6e9y4s5t -->
    <add name="YourProvider" 
         type="YourNamespace.YourProvider"     
         connectionStringName="YourConnectionString"
         enablePasswordRetrieval="false"
         enablePasswordReset="true"
         requiresQuestionAndAnswer="true"
         passwordFormat="Hashed"
         applicationName="IMPORTANT" />
  </providers>
</membership>
    // Sample calling the create user function  
    // POST: /Account/Register

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus;
            Membership.CreateUser(model.UserName, model.Password, model.Email, passwordQuestion: null, passwordAnswer: null, isApproved: true, providerUserKey: null, status: out createStatus);

            if (createStatus == MembershipCreateStatus.Success)
            {
                FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", ErrorCodeToString(createStatus));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }