如何配置Ninject以使用ServiceStack.net

本文关键字:ServiceStack net Ninject 何配置 配置 | 更新日期: 2023-09-27 18:26:11

在尝试将ServiceStack.net配置为使用Ninject作为其IOC时,我遇到了一些错误,涉及到未定义的各种绑定。主要用于ICache客户端。

需要创建哪些特定绑定才能正确使用Ninject?

目前已指定:

Bind<ISessionFactory>().To<SessionFactory>();//Is this correct/needed?

注意

我已经根据ServiceStack文档创建了一个IContainerAdapter来实现Ninject的使用。(点击此处:ServiceStack IOC文档)

注意2我的apphost配置方法如下:

public override void Configure(Funq.Container container)
{
        IKernel kernel = new StandardKernel(new BindingModule());
        container.Adapter = new NinjectContainerAdapter(kernel);
}

注意3

我已按如下方式注册ICacheClient:Bind().To();

我现在收到一个指向IRequest 的错误

Error activating IRequestLogger'nNo matching bindings are available, and the type is not self-bindable

容器适配器

public class NinjectContainerAdapter : IContainerAdapter
{
    private readonly IKernel _kernel;
    public NinjectContainerAdapter(IKernel kernel)
    {
        this._kernel = kernel;
    }
    public T TryResolve<T>()
    {
        return this._kernel.Get<T>();
    }
    public T Resolve<T>()
    {
        return this._kernel.Get<T>();
    }
}

如何配置Ninject以使用ServiceStack.net

您是否为Container适配器注入了:

container.Adapter = new NinjectIocAdapter(kernel);

如果是这样的话,如果你还没有这样做,也可以尝试将你的AppHost类设置为内部。AppHost应该只有一个实例,一些IOC喜欢创建自己的实例,从第一个实例中删除所有配置。

您得到的行为听起来像是Ninject在抱怨未解决的依赖关系。通过在容器适配器中使用kernal.TryGet<T>,确保Ninject返回具有未解析依赖项的null,例如:

public T TryResolve<T>()
{
    return this._kernel.TryGet<T>();
}

您需要编写自己的IContainerAdapter,然后在AppHost 中设置Container.Adapter