2010-10-11 6 views
7

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

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

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

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

Service (Конструктор принимает хранилище пользователя)

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. 
    } 
} 
+0

возможно дубликат [Вводить хранилище для настраиваемого поставщика членства с Ninject ] (http://stackoverflow.com/questions/5596441/inject-repository-to-custom-membership-provider-with-ninject) –

+0

См. http: // stackoverflow.com/a/10394860/11635 - Я думаю, что решение Remo не получает достаточной прессы, и я очень не впечатлен ответами на этот вопрос, который по какой-то причине является самым высоким рейтингом google. Поймите, что это не намного более новое, что делает меня менее уверенным в том, что вы хотите, чтобы это было dup. Они оба плохие, я считаю! –

ответ

19

Уже ответил на вопрос, но я думаю, что лучший ответ - сделать репозиторий собственностью вашего MemberhipProvider и ввести его в 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/

+0

Спасибо, я посмотрю на это позже –

+0

С удовольствием. У меня были некоторые проблемы с разработкой, как это сделать самому, так как здесь есть несколько вопросов по этому вопросу, но ответы не так ясны или даже хороши. Я на самом деле просто переделал статью час назад, чтобы быть более ясным. – DanH

+0

Это отличный способ обойти раздражающие зависимости в пользовательском членском провайдере - это должен быть ответ – Dann

3

Вы можете переопределить функцию MembershipProvider.Initialize, а также необходимы некоторые настройки в сети .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); 

Я думаю, что это более просто.

Смежные вопросы