代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

带有存储库和ninject的ASP.NET MVC MembershipProvider

  •  7
  • Shawn Mclean  · 技术社区  · 16 年前

    这就是我的应用程序的结构:

    存储库(实现中的构造函数采用连接字符串)

    public interface IUserRepository
    {
        IQueryable<User> GetUsers();
        IQueryable<UserRole> GetUserRoles();
        void InsertUser(User user);
    }
    

    服务(构造函数接受用户存储库)

    public interface IUserService
    {
        User GetUser(int userId);
        User GetUser(string email);
    }
    

    用户控制器(我的控制器的一个例子)

    public class UsersController : Controller
    {
        private IUserService userService;
        public UsersController(IUserService userServ)
        {
            userService = userServ;
        }
    }
    

    public class NinjectConfigurationModule : NinjectModule
    {
    
        public override void Load()
        {
            Bind<IUserService>().To<UserService>();
            Bind<IUserRepository>().To<UserRepository>()
                .WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString
                );
        }
    }
    

    NinjectControllerFactory公司

    public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel kernel = new StandardKernel(new NinjectConfigurationModule());
    
        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            // We don't want to pass null to ninject as we'll get a strange error.
            return controllerType == null ? null
                                          : (IController)kernel.Get(controllerType);
        }
    }
    

    MembershipProvider(这就是我的问题所在)

    public class SimpleMembershipProvider : MembershipProvider
    {
         //How do I set up User Service here so that ninject can put my connection string here.
         public override bool ValidateUser(string username, string password)
         {
               //Code to use user service.
         }
    }
    
    2 回复  |  直到 16 年前
        1
  •  19
  •   DanH    15 年前

    已经回答了问题,但我认为更好的答案是使存储库成为MembershipProvider上的一个属性,并在应用程序启动时注入它。例如

    public class AccountMembershipProvider : MembershipProvider
    {
        [Inject]
        public IAccountRepository AccountRepository { get; set; }
        ...
    }
    

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
    
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
    
            // Inject account repository into our custom membership & role providers.
            _kernel.Inject(Membership.Provider);
    
            // Register the Object Id binder.
            ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
        }
    

    http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-with-repository-injection/

        2
  •  3
  •   Liu Peng    16 年前

    public override void Initialize(string name, NameValueCollection config) {
        // Validate arguments
        if (config == null) throw new ArgumentNullException("config");
    
        // Initialize base class
        base.Initialize(name, config);
    
        // Initialize current class
        this.configuration = config;
        System.Configuration.ConnectionStringSettings ConnectionStringSettings = System.Configuration.ConfigurationManager.ConnectionStrings[config["connectionStringName"]];
        if (ConnectionStringSettings == null || ConnectionStringSettings.ConnectionString.Trim() == "") throw new ProviderException("Connection string cannot be blank.");
        // then you can create a new user service using the connection string: SimpleAuthDb
    }
    

    web.config配置

    <membership defaultProvider="MyMembershipProvider">
        <providers>
            <clear/>
            <add name="MyMembershipProvider"
                 type="Web.SimpleSqlMembershipProvider"
                 connectionStringName="SimpleAuthDb" />
        </providers>
    </membership>
    

    我还创建了一个像您这样的自定义成员资格提供程序。 在用户控制器的登录操作中将调用validateuser函数,如下所示:

    Membership.ValidateUser(userName, password);
    

    在里面 ,然后是这样的代码:

    userService.ValidateUser(userName, password);
    

    我觉得这更简单。