3

我扩展了 service-stack 提供的 CredentialsAuthProvider 以允许我针对 Active-Directory 实例进行身份验证。AD 访问逻辑封装在一个名为AdManager的自定义类中(见下文),例如:

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

问题:

  • 我希望我可以在我的扩展“AppHostBase”中使用服务堆栈内置 IoC“Funq.Container”注册AdManager ,并从我的自定义 CredentialsAuthProvider 中访问它?我尝试注册它,但没有找到通过内置框架的服务堆栈访问 IoC(或我注册的 AdManager 对象)的方法。

我错过了什么吗?谢谢

4

2 回答 2

7

您可以使用提供的 AuthProvider 从内部访问 IOC IServiceBase,例如:

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

在其他任何地方,您始终可以使用 Singleton 解决依赖关系:

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

否则,如果您知道它在 ASP.NET Web 主机中,您也可以通过 AppHost 单例访问它:

var addManager = AppHostBase.Instance.Resolve<IAdManager>();
于 2013-04-11T23:18:18.247 回答
1

服务堆栈也使用属性注入。我在扩展服务堆栈提供的服务类时使用了属性注入。

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。但我还没有测试过。

于 2013-04-11T23:04:23.937 回答