ASP.NET MVC MembershipProvider с хранилищем и нинъекцией - PullRequest
7 голосов
/ 11 октября 2010

Как мне связаться с UserService через переопределенный класс MembershipProvider?Я понятия не имею, как передать строку подключения в хранилище пользователя внутри службы.

Вот как структурировано мое приложение:

Репозиторий (конструктор в реализации принимает строку подключения)

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

Служба (Конструктор принимает пользовательский репозиторий)

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

UserController (Пример моего контроллера)

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

NinjectConfigurationModule

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 ]

19 голосов
/ 24 июня 2011

Уже ответил на вопрос, но я думаю, что лучший ответ - сделать хранилище свойством вашего MembershipProvider и добавить его в Application_Start например,

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/

3 голосов
/ 12 октября 2010

Вы можете переопределить функцию MembershipProvider.Initialize, а также использовать некоторые настройки в web.config

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

, но в конечном итоге я оставляю поставщика членства и добавляю новую функцию ValidateUser в IUserService и затем код, подобный следующему:

userService.ValidateUser(userName, password);

Я думаю, что это проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...