2

我觉得我在这里缺少一些明显的东西。我正在尝试使用 ninject 创建一个类。该类接受存储在 HttpContext 的 Session 中的单个字符串参数。如何将该参数传递给此类?

该类看起来像:

public class Manager : IManager
{
    public Manager(string a) { ... }
}

我有一个自定义的依赖解析器,如下所示:

public class NinjectDependencyResolver : IDependencyResolver
{
    IKernel kernel;
    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        Bind<IManager>().To<Manager>()
    }

    ...
}

典型的控制器如下所示:

public class ManagerController : Controller
{
    public ManagerController(IManager manager) { ... }
}
4

4 回答 4

4

参数存储在 Session 中是相关的实现细节,不属于 Ninject 配置。

您应该创建一个IManagerConfiguration接口,该接口具有管理器的每个配置值的属性以及该接口的会话存储实现。现在您可以为它们添加一个简单的绑定并将接口传递给管理器构造函数而不是字符串。

于 2012-07-27T07:48:44.657 回答
1

更新:

最初无法访问会话,请查看下面的@James 答案。

您是否尝试使用WithConstructorArgument.

public class NinjectDependencyResolver : IDependencyResolver
{
    IKernel kernel;
    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        Bind<IManager>()
           .To<Manager>()
           .WithConstructorArgument("a", ..)
    }

    ...
}
于 2012-07-27T04:10:28.073 回答
0

试试这个

            var copyToNew = new ConstructorArgument("isCopyToNew", IsCopyToNew);
            IParameter[] pars = new Parameter[] {  copyToNew };
            var anyViewModel = IoC.Kernel.Get<IAnyViewModel>(pars);

或者

var anyViewModel=IoC.Kernel.Get<IAnyViewModel>(new ConstructorArgument("isCopyToNew",IsCopyToNew));
于 2012-07-27T04:01:44.083 回答
0

如果您可以将 Manager 参数从字符串更改为Func<string>,那么您可以使用 WithConstructorArgument 和 () => HttpContext.Current.Session["foo"].ToString() 的 Func

如果你不能,那么我可能会用一个带有该字符串参数的 Create 方法注入一个 IManagerFactory,虽然你可以通过创建自己的工厂来手动完成,但我会使用 ToFactory 的 ninject 扩展。

https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface

于 2012-07-27T06:34:07.547 回答