我正在尝试使用MVC 3中的ninject将存储库注入自定义成员资格提供程序.
在MembershipProvider中,我尝试了以下内容:
[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)
和
[Inject]
public TUMembershipProvider(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
Run Code Online (Sandbox Code Playgroud)
在我的ninject模块中,我尝试了以下方法:
Bind<MembershipProvider>().ToConstant(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)
以上都不是.
当我使用(在global.asa)
kernel.Inject(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)
和...一起
[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)
它有效,但我没有生命周期管理,这将导致NHibernate的"ISession is open"错误,因为ISession是InRequestScope而存储库不是.
我正在尝试在MVC3应用程序中使用自定义角色提供程序.我已经使用Ninject让会员提供商工作正常,但似乎无法让角色提供者工作.成员资格提供程序不需要无参数构造函数,但角色提供程序不需要.这是一些代码片段:
Web.config文件
<membership>
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyApp.Models.NHibernateMembershipProvider"
applicationName="myApp" />
</providers>
</membership>
<roleManager enabled="true">
<providers>
<add name="MyRolesProvider" type="MyApp.Models.NHibernateRoleProvider"
applicationName="myApp" />
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
我有一个Ninject模块.
public class MyNinjectModule : NinjectModule
{
public override void Load()
{
this.Bind<ISession>().ToMethod(
x => MyApp.MvcApplication.SessionFactoryData.GetCurrentSession());
// Respository
this.Bind<IUserRepository>().To<UserRepository>();
this.Bind<MembershipProvider>().To<NHibernateMembershipProvider>();
this.Bind<RoleProvider>().To<NHibernateRoleProvider>();
}
}
Run Code Online (Sandbox Code Playgroud)
自定义成员资格提供者
public class NHibernateMembershipProvider : MembershipProvider
{
private IUserRepository _repo;
public NHibernateMembershipProvider(IUserRepository repository)
{
_repo = repository;
}
...
Run Code Online (Sandbox Code Playgroud)
角色提供者
public class NHibernateRoleProvider : RoleProvider
{
private IUserRepository _repo;
public NHibernateRoleProvider(IUserRepository repository)
{
_repo = …Run Code Online (Sandbox Code Playgroud) 好的,所以我几个小时都在研究这个问题.我在这里发现了几个帖子,但实际上没有解决问题.那么,让我再试一次......
我有一个使用Ninject和自定义成员资格提供程序的MVC2应用程序.
如果我尝试使用ctor注入提供程序,我会收到一个错误:'没有为此对象定义无参数构造函数.'
public class MyMembershipProvider : MembershipProvider
{
IMyRepository _repository;
public MyMembershipProvider(IMyRepository repository)
{
_repository = repository;
}
Run Code Online (Sandbox Code Playgroud)
我也一直在玩工厂和Initialize(),但一切都空白了.
有什么想法/例子吗?
根据这篇文章描述custom-membership-provider-with-repository-injection
我实现自定义成员资格提供注入.
定制会员提供商
using Ninject;
public class CustomMembershipProvider : MembershipProvider
{
[Inject]
public IUserRepository UserRepository { get; set; }
[...]
Run Code Online (Sandbox Code Playgroud)
自定义角色提供者
using Ninject;
public class CustomRoleProvider : RoleProvider
{
[Inject]
public IUserRoleRepository UserRoleRepository { get; set; }
[...]
Run Code Online (Sandbox Code Playgroud)
在Web.Config中
<membership defaultProvider="CustomsMembershipProvider">
<providers>
<clear/>
<add name="CustomsMembershipProvider" type="namespace.CustomsMembershipProvider"/>
</providers>
</membership>
<roleManager enabled="true" defaultProvider="customRoleProvider">
<providers>
<clear/>
<add name="customRoleProvider" type="namespace.customRoleProvider"/>
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
现在在NinjectWebCommon中
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel); …Run Code Online (Sandbox Code Playgroud) asp.net-mvc entity-framework ninject custom-membershipprovider