Asp.net-Mvc-3

自定義成員提供者和統一依賴注入

  • May 21, 2013

我發現了一些與我發布的問題類似的問題,但我沒有從他們那裡得到我真正需要的東西。我仍在努力實現我的CustomMembershipProviderusing Microsoft Unity DI

自定義會員:

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;
       }
       ...

帳戶控制器:

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班級創建一個界面?

我試過了:

public interface ICustomMembershipProvider : MembershipProvider

但我認為這不起作用,所以我被卡住了,不知道如何MembershipProvider使用我的儲存庫、UoW、服務和 Unity DI來實現

回答第二個問題

MembershipProviderand的問題RoleProvider在於它們不是由容器建構的,而是由框架建構的。AFAIK 設置活動成員資格提供程序的唯一方法是 web.config 文件。因此,如果您想使用容器通過容器解決儲存庫、服務等依賴項,您必須使用舊的(我在開玩笑)服務定位器模式。

public class CustomMebershipProvider : ICustomMebershipProvider  {
  public bool ValidateUser(string user, string pwd) {
    var svc = Global.Container.Resolve<IMyService>();
    /* ... */
  }
}

對第一個問題

您仍然可以使用建構子注入在控制器中註入活動的成員資格提供程序。首先,創建一個包含您需要的所有方法的介面。這裡的問題是這MembershipProvider是一個具體的類,所以你不能從它繼承一個介面。只需創建您的新界面,從以下位置複製您需要的函式的方法簽名MembershipProvider

public interface ICustomMembershipProvider {
   bool MyMethod();


   /* From MembershipProvider */
   bool ValidateUser(string username,  string password);
   /* ... */
}

然後讓您的提供者實現它並註入:

Container
 .RegisterType<ICustomMembershipProvider>(
    new InjectionFactory(c => (ICustomMembershipProvider) Membership.Provider))

當然,您仍然需要在 web.config 中註冊您的自定義成員資格提供程序。

引用自:https://stackoverflow.com/questions/16626656