根据这篇文章描述custom-membership-provider-with-repository-injection
我实现自定义成员资格提供注入。
自定义成员资格提供程序
using Ninject;
public class CustomMembershipProvider : MembershipProvider
{
[Inject]
public IUserRepository UserRepository { get; set; }
[...]
自定义角色提供程序
using Ninject;
public class CustomRoleProvider : RoleProvider
{
[Inject]
public IUserRoleRepository UserRoleRepository { get; set; }
[...]
在 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>
现在在 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);
return kernel;
}
private static void RegisterServices(IKernel kernel)
{
[...]
kernel.Bind<IUserRepository>().To<UserRepository>();
kernel.Bind<IUserRoleRepository>().To<UserRoleRepository>();
// Inject user & role repository into our custom membership & role providers.
kernel.Inject(Membership.Provider);
kernel.Inject(Roles.Provider);
}
当我运行应用程序时出现错误
在应用程序的预启动期间无法调用此方法 初始化阶段。
来自kernel.Inject(Membership.Provider);
这一行
但如果我的内核设置放在 Application_Start
中我得到了以下错误
激活IUserRepository时出错没有匹配的绑定可用, 并且类型不可自我绑定。激活路径:2)注射 依赖IUserRepository到属性UserRepository的类型 CustomMembershipProvider 1)对CustomeMembershipProvider的请求
如何解决这个问题。 ??
答案 0 :(得分:8)
结果始终为null。为什么?因为asp.net拥有自己的会员静态属性。
是membership .provider。并且此实例不是实例ninject管理的一部分。
要解决它,你需要使用kernel.inject。但是在生成aspnetmvc.cs时,您会看到它在PreApplicationStart事件上注入,并且不会让您。
这是 cipto 的解决方案,为我解决问题。将此添加到您的NinjectWebCommon
[assembly: WebActivator.PreApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Start")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "RegisterMembership")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Stop")]
public static void RegisterMembership()
{
bootstrapper.Kernel.Inject(Membership.Provider);
}
答案 1 :(得分:1)
我在尝试此操作时遇到了很多麻烦,最后添加了一个让我获得存储库的方法
using System.Web.Mvc; //Used to access dependency resolver
private IUserRepository GetUserRepository()
{
return DependencyResolver.Current.GetService<IUserRepository>();
}
然后我在需要它的方法中调用它
我能够使用构造函数注入来获取注入库,但是一旦我去使用存储库,对象就被处理掉了。我发现上面是最简单的选择。
但是,我猜您也可以使用Initialize()
方法
IUserRepository userRepository;
public override void Initialize(string name, NameValueCollection config)
{
base.Initialize(name, config);
this.userRepository = DependencyResolver.Current.GetService<IUserRepository>();
}
或者另一种方法是使用属性
public IUserRepository UserRepository
{
get
{
return DependencyResolver.Current.GetService<IUserRepository>();
}
}
答案 2 :(得分:1)
由于自定义RoleProvider
通常随自定义MembershipProvider
一起提供,因此在为Role Provider类添加注入时非常有用。我使用 ramon22&#39> 解决方案添加了一行。
[assembly: WebActivator.PreApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Start")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "RegisterMembership")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Stop")]
public static void RegisterMembership()
{
bootstrapper.Kernel.Inject(Membership.Provider);
bootstrapper.Kernel.Inject(Roles.Provider);
}