我发现了一些与我要发布的问题类似的问题,但是我没有从中得到我真正需要的东西。
我仍在努力使用CustomMembershipProvider
实现我的Microsoft Unity DI
。
自订成员(member)资格:
public class CustomMembershipProviderService : MembershipProvider
{
private readonly IUserService _userService;
public CustomMembershipProviderService(IUserService userService)
{
this._userService = userService;
}
public override string ApplicationName
{
...
用户服务:
public class UserService : IUserService
{
private readonly IUserRepository _repository;
private readonly IUnitOfWork _unitOfWork;
public UserService(IUserRepository repository, IUnitOfWork unitOfWork)
{
this._repository = repository;
this._unitOfWork = unitOfWork;
}
...
AccountController:
public class AccountController : Controller
{
// next line is what I don't feel too sure about what to do?
// shouldn't my controller constructor use an Interface as its property?
private readonly CustomMembershipProviderService _customMembershipProviderService;
public AccountController(CustomMembershipProviderService customMembershipProviderService)
{
this._customMembershipProviderService = customMembershipProviderService;
}
...
如何为
MembershipProvider
类创建接口(interface)?我试过了:
public interface ICustomMembershipProvider : MembershipProvider
但是我认为那行不通,所以我被困住了,也不知道如何使用我的存储库,UoW,服务和Unity DI来实现
MembershipProvider
最佳答案
回答第二个问题MembershipProvider
和RoleProvider
的问题在于它们不是由容器构建的,而是由框架构建的。 AFAIK设置事件成员资格提供程序的唯一方法是web.config文件。
因此,如果您想使用容器通过容器来解决诸如存储库,服务等依赖项,则必须使用旧的(我在开玩笑)服务定位器模式。
public class CustomMebershipProvider : ICustomMebershipProvider {
public bool ValidateUser(string user, string pwd) {
var svc = Global.Container.Resolve<IMyService>();
/* ... */
}
}
对于第一个问题
您仍然可以使用构造函数注入(inject)在 Controller 中注入(inject)事件成员资格提供程序。
首先,使用所需的所有方法创建一个接口(interface)。这里的问题是
MembershipProvider
是一个具体的类,因此您不能从中继承接口(interface)。只需创建您的新接口(interface),从MembershipProvider
复制所需功能的方法签名即可:public interface ICustomMembershipProvider {
bool MyMethod();
/* From MembershipProvider */
bool ValidateUser(string username, string password);
/* ... */
}
然后让您的提供者实现它并注入(inject):
Container
.RegisterType<ICustomMembershipProvider>(
new InjectionFactory(c => (ICustomMembershipProvider) Membership.Provider))
当然,您仍然必须在web.config中注册自定义成员资格提供程序。