Dependency injection 自定义成员资格提供程序和Unity注入
我已经为我的MVC4解决方案创建了一个自定义成员资格提供程序。问题是我不能通过团结来注射 我曾尝试使用构造函数注入,但随后出现了无参数构造函数错误。如果我尝试使用InjectionProperty,它不会更改我的任何属性。我已尝试使用DependencyResolver.Current.GetService();它返回null 我首先通过web.config连接了提供程序:Dependency injection 自定义成员资格提供程序和Unity注入,dependency-injection,unity-container,custom-membershipprovider,Dependency Injection,Unity Container,Custom Membershipprovider,我已经为我的MVC4解决方案创建了一个自定义成员资格提供程序。问题是我不能通过团结来注射 我曾尝试使用构造函数注入,但随后出现了无参数构造函数错误。如果我尝试使用InjectionProperty,它不会更改我的任何属性。我已尝试使用DependencyResolver.Current.GetService();它返回null 我首先通过web.config连接了提供程序: <membership defaultProvider="ExtendedServiceMembershipPr
<membership defaultProvider="ExtendedServiceMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add name="ExtendedServiceMembershipProvider" type="Foo.Providers.Security.BoxMembershipProvider, Foo" />
</providers>
</membership>
<roleManager defaultProvider="ExtendedServiceRoleProvider">
<providers>
<clear />
<add name="ExtendedServiceRoleProvider" type="Foo.Providers.Security.BoxRoleProvider, Foo" />
</providers>
</roleManager>
这是正确的方法吗?
希望你们中的一些人能解决我的问题
谢谢。您应该做的是创建一个空的成员资格提供程序,它只需调用MVC依赖项解析器来获取真正的
成员资格提供程序。通过这样做,您可以实现三件事:
- 此实现有一个默认构造函数,可以在web.config中配置
- 该实现是一个MVC基础设施组件,与包含该实现(您可能想要测试)的实际成员资格提供程序分离
- 这个基础设施组件不依赖于Unity(或任何其他容器),而只依赖于MVC3,这降低了容器本身的耦合
实现可能如下所示:
public class DependencyResolverMembershipProvider : MembershipProvider
{
private static MembershipProvider Provider
{
get
{
var provider = DependencyResolver.Current.GetService<MembershipProvider>();
if (provider == null)
{
throw new InvalidOperationException(
"Make sure the MembershipProvider is registered.");
}
return provider;
}
}
public override string ApplicationName
{
get { return Provider.ApplicationName; }
set { Provider.ApplicationName = value; }
}
public override bool ChangePassword(string username,
string oldPassword, string newPassword)
{
return Provider.ChangePassword(username, oldPassword, newPassword);
}
public override bool ChangePasswordQuestionAndAnswer(string username,
string password, string newPasswordQuestion, string newPasswordAnswer)
{
return Provider.ChangePasswordQuestionAndAnswer(username,
password, newPasswordQuestion, newPasswordAnswer);
}
public override MembershipUser CreateUser(string username,
string password, string email, string passwordQuestion,
string passwordAnswer, bool isApproved, object providerUserKey,
out MembershipCreateStatus status)
{
return Provider.CreateUser(username, password, email,
passwordQuestion, passwordAnswer, isApproved, providerUserKey,
out status);
}
// Implement all other methods here
}
公共类依赖项ResolverMembershipProvider:MembershipProvider
{
私有静态成员身份提供程序
{
得到
{
var provider=DependencyResolver.Current.GetService();
if(提供程序==null)
{
抛出新的InvalidOperationException(
“确保会员资格提供商已注册。”);
}
退货供应商;
}
}
公共重写字符串ApplicationName
{
获取{return Provider.ApplicationName;}
设置{Provider.ApplicationName=value;}
}
public override bool ChangePassword(字符串用户名,
字符串oldPassword,字符串newPassword)
{
返回Provider.ChangePassword(用户名、旧密码、新密码);
}
公共覆盖bool ChangePasswordQuestionAndAnswer(字符串用户名,
字符串密码、字符串newPasswordQuestion、字符串newPasswordAnswer)
{
返回提供程序.ChangePasswordQuestionAndAnswer(用户名,
密码、新密码问题、新密码答案);
}
公共覆盖成员身份用户CreateUser(字符串用户名,
字符串密码、字符串电子邮件、字符串密码问题、,
字符串passwordAnswer,bool已批准,对象提供程序UserKey,
out成员身份(创建状态)
{
返回Provider.CreateUser(用户名、密码、电子邮件、,
passwordQuestion、passwordAnswer、isApproved、providerUserKey、,
退出状态);
}
//在这里实现所有其他方法
}
这仍然是大量的工作,因为MembershipProvider
有很多方法。有两种方法可以简化此过程:
- 使用一个框架,例如,它已经为您做了这样的事情,并且以一种更愉快的方式来做,因为它分离了这些类中的职责,并公开了一些您可以为此功能实现的新接口
- 防止系统的任何部分依赖于静态
成员身份
类,但始终将成员身份提供程序
注入这些类,甚至更好:不要使用成员身份提供程序
,而只需注入该成员身份提供程序
(例如IUserRepository
和IPasswordManager
)
谢谢,这对我来说更有意义。最后,我决定将自定义登录与已创建的MembershipService一起使用。