7

在尝试将 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>();
    }
}
4

2 回答 2

9

您是否已将 Container 适配器注入:

container.Adapter = new NinjectIocAdapter(kernel);

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

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

public T TryResolve<T>()
{
    return this._kernel.TryGet<T>();
}
于 2012-03-01T15:50:29.237 回答
1

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

于 2012-03-01T15:35:56.980 回答