2013-04-11 53 views
3

我已經擴展了服務堆棧提供的CredentialsAuthProvider,以允許我對Active-Directory實例進行身份驗證。的AD訪問邏輯封裝稱爲的AdManager的自定義類內(見下文) 例如:ServiceStack訪問自定義CredentialsAuthProvider中的Ioc容器

public class AdCredentialsAuthProvider : CredentialsAuthProvider 
{ 
    public override bool TryAuthenticate(IServiceBase authService, 
              string userName, 
              string password) 
    { 
     IAdManager manager = new AdManager(); 
     return manager.Authenticate(userName, password); 
    } 
    ... 

問題:

  • 我希望我可以登記使用的AdManager服務在我的擴展「AppHostBase」中內置IoC「Funq.Container」並從我的自定義CredentialsAuthProvider中訪問它?我嘗試註冊它,但沒有找到通過內置的服務堆棧訪問IoC(或我註冊的AdManager對象)的方法。

我錯過了什麼嗎? 謝謝

回答

7

您可以從AuthProvider內與所提供的IServiceBase,例如訪問IOC:

var addManager = authService.TryResolve<IAdManager>(); 

在別的地方你總是可以解決使用Singleton依賴關係:

var addManager = HostContext.TryResolve<IAdManager>(); 

否則,如果你知道它的在ASP.NET Web主機中,您還可以通過AppHost單例訪問它:

var addManager = AppHostBase.Instance.Resolve<IAdManager>(); 
+1

謝謝Mythz ....非常棒的API你們......不知道我有多少享受與框架一起工作,乾淨和深思熟慮的服務堆棧...... – darthal 2013-04-12 13:19:56

1

服務堆棧也使用屬性注入。在擴展服務棧提供的Service類時,我使用了屬性注入。

public class MyService : Service 
{ 
     public MyService(IDb db) 
     { 
      //db constructor inject 
     } 

     public IValidator<MyData> MyDataValidator { get; set; } 

     public object Get(MyData request) 
     { 
      //MyDataValidator is property injected 
     } 
} 

我相信同樣的邏輯可以應用於AuthProvider。但我沒有測試過它。