【发布时间】: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