0

このソリューションの続き: MVC4 およびカスタム メンバーシップ プロバイダー用に Ninject を構成する方法は?

私は宣言する

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

UserRepository内に実装する

public class UserRepository : RepositoryBase<MyDbContext, UserModel>, IUserRepository
{
        UserModel _user = null;

        public UserRepository(IUnitOfWork<MyDbContext> unitOfWork)
            : base(unitOfWork)
{

}

   public MembershipUser CreateUser(string username, ... , string providername = null)
        {                
            using (UnitOfWork)
            {                   
                _user = new UserModel
                {
                    Id = Guid.NewGuid(),
                    RoleId = roleId
                    [other property set]
                };    
                Insert(_user);
                UnitOfWork.Commit();
             }
                status = MembershipCreateStatus.Success;

                return new MembershipUser(providername, ...);
}

public bool RegisterUser(UserModel user)
{
        MembershipCreateStatus createStatus;
        CreateUser(user.UserName, user.Password, user.Email, user.PasswordQuestion, user.PasswordAnswer, user.IsApproved, null, out createStatus, ...);

   if (createStatus == MembershipCreateStatus.Success)
   {
                    return true;
   }
   else
   {                return false;
   }
}
[..]

現在、CustomMembership プロバイダー内

public class CustomMembershipProvider : MembershipProvider
    {

        public IUserRepository UserRepository { get { return DependencyResolver.Current.GetService<IUserRepository>(); } }

    public override MembershipUser CreateUser(string username, ...)
        {
            return UserRepository.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status, Membership.Provider.Name);
        }
[...]

現在コントローラー内

public AccountController(IAccountRepository accountRepository, IUserRepository userRepository, IUnitOfWork<MyDbContext> unitOfWork)
{
            _acountRepository = accountRepository;
            _userRepository = userRepository;
            UnitOfWork = unitOfWork;
}

public ActionResult Register(UserModel model)
{
    if (ModelState.IsValid)
    {
      _userRepository.RegisterUser(model);
    }
}

ノート:

1.この行の UserRepository CreateUser メソッドからエラー Provider name is Nullを取得しました。return new MembershipUser(providername,...);

しかし、私はすでにcustomMembershipプロバイダーMembership.Provider.Name内でそれを渡しています。

2. ControllerからMembershipproviderメソッドを呼び出す適切な方法は何ですか?

3. IUserRepositoryを介してメンバーシップ プロバイダー メソッドを呼び出すために必要なその他のNinject構成はありますか?

 kernel.Bind<IUserRepository>().To<UserRepository>();

4.前の投稿のWeb.config

4

2 に答える 2

0

したがって、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 に本当にしたいこと。

単純な「この行を変更してください」という回答はできません。問題は概念的なものです。申し訳ありません。ハードコーディングされたプロバイダー名を渡すこともできますが、実際にはすべてに違反し始めます。

于 2013-01-20T14:32:56.457 に答える
0

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>

コントローラーは、createUser Membership.CreateUser またはMembership.ValidateUserの静的クラスを呼び出し てログオンします。

カスタム プロバイダーの実装の詳細については、http://msdn.microsoft.com/en-us/library/44w5aswa%28v=vs.100%29.aspx を参照して ください。

    // 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);
    }
于 2013-01-21T11:35:48.850 に答える