【问题标题】:Ninject with MVC - how can I manually get object from ninject inside controller method?Ninject with MVC - 如何从控制器方法中的 ninject 手动获取对象?
【发布时间】:2014-04-28 09:28:07
【问题描述】:

我的意思是 - 当我为我的控制器使用 Ninject 时,它会自动将所有字段注入控制器构造函数,现在......我的项目中有一个名为 CommonMethods 的类,我需要将某些字段从控制器传递给那个为了使用它的类(这个类只包含非静态方法,所以需要创建它),当然我可以像这样手动完成:

CommonMethods cm = new CommonMethods(someVarFromCurrentcontroller, someTherVar,... and so on..);
cm.SomeMethod();

但是上面会迫使我手动更新代码,每次我修改“CommonMethods”构造函数时,所以问题是 - 这里有什么方法可以使用 Ninject 吗?我想做类似的事情:

IKernel k = new StandardKernel();
CommonMethods c = k.Get<CommonMethods>();

但是,如果我尝试上述操作,则会出现“没有可用于 X 的匹配绑定”的错误消息(但它们确实存在)。我想这是因为我使用的是新内核,而不是应用程序启动时使用的内核。我该如何解决这个问题?

提前致谢。

最好的问候。

编辑 1:

这就是我的控制器构造函数的样子:

private EFDbContext context;

private ISaleActionRepository saleActionRepository;
private IUserRepository userRepository;

public TestController(ISaleActionRepository saleActionRepository, IUserRepository userRepository, EFDbContext context)
{
    this.saleActionRepository = saleActionRepository;
    this.userRepository = userRepository;

    this.context = context;
}

这就是我的 CommonMethods 控制器的样子:

private IUserRepository userRepository;
private IPaymentRepository paymentRepository;
private IFunctionalityPackageRepository functionalityPackageRepository;
private ISettingRepository settingRepository;

public CommonMethods(IUserRepository userRepository, IPaymentRepository paymentRepository, IFunctionalityPackageRepository functionalityPackageRepository, ISettingRepository settingRepository)
{
    this.userRepository = userRepository;
    this.paymentRepository = paymentRepository;
    this.functionalityPackageRepository = functionalityPackageRepository;
    this.settingRepository = settingRepository;
}

【问题讨论】:

  • 您的CommonMethods 类似乎提供了运行时值。您的 DI 容器应该只负责通过使用编译依赖项和配置值来构建对象图。所以最好不要从内核中解析 CommonMethods 类。
  • @Steven:我必须说我不明白 - 请看我的编辑,我添加了一些代码来展示构造函数在 MVC 控制器类和我的 CommonMethods 类中的样子,如您所见- 实际上是相同的,为什么将 Ninject 用于控制器是好的,但对其他类不好?请解释一下。
  • 啊,我明白了。只需将CommonMethods 注入TestController 的构造函数即可。您应该让容器一直构建对象图。
  • @Steven:成功了,谢谢 :)

标签: c# asp.net-mvc-4 dependency-injection ninject


【解决方案1】:

只需在TestController 的构造函数中添加CommonMethods 服务作为参数,然后让容器构建完整的对象图。这样的对象图可以有很多层。

private readonly EFDbContext context;
private readonly ISaleActionRepository saleActionRepository;
private readonly IUserRepository userRepository;
private readonly CommonMethods commonMethods;

public TestController(ISaleActionRepository saleActionRepository, 
    IUserRepository userRepository, EFDbContext context, CommonMethods commonMethods)
{
    this.saleActionRepository = saleActionRepository;
    this.userRepository = userRepository;
    this.context = context;
    this.commonMethods = commonMethods;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多