2013-04-11 28 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。但我没有测试过它。