gpt4 book ai didi

c# - IoC (Ninject) 和工厂

转载 作者:IT王子 更新时间:2023-10-29 04:29:49 24 4
gpt4 key购买 nike

如果我有以下代码:

public class RobotNavigationService : IRobotNavigationService {
public RobotNavigationService(IRobotFactory robotFactory) {
//...
}
}
public class RobotFactory : IRobotFactory {
public IRobot Create(string nameOfRobot) {
if (name == "Maximilian") {
return new KillerRobot();
} else {
return new StandardRobot();
}
}
}

我的问题是在这里进行控制反转的正确方法是什么?我不想将 KillerRobot 和 StandardRobot 具体添加到 Factory 类中,对吗?而且我不想通过 IoC.Get<> 引入它们,对吗? bc 那将是 Service Location 不是真正的 IoC 对吗?有没有更好的方法来解决在运行时切换混凝土的问题?

最佳答案

对于您的示例,您有一个非常好的工厂实现,我不会更改任何内容。

但是,我怀疑您的 KillerRobot 和 StandardRobot 类实际上具有它们自己的依赖项。我同意您不想将 IoC 容器暴露给 RobotFactory。

一种选择是使用 ninject 工厂扩展:

https://github.com/ninject/ninject.extensions.factory/wiki

它为您提供了两种注入(inject)工厂的方法 - 通过接口(interface),以及通过注入(inject)返回 IRobot(或其他)的 Func。

基于接口(interface)的工厂创建示例:https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface

基于函数的示例:https://github.com/ninject/ninject.extensions.factory/wiki/Func

如果需要,您也可以通过在 IoC 初始化代码中绑定(bind)一个函数来实现。像这样的东西:

var factoryMethod = new Func<string, IRobot>(nameOfRobot =>
{
if (nameOfRobot == "Maximilian")
{
return _ninjectKernel.Get<KillerRobot>();
}
else
{
return _ninjectKernel.Get<StandardRobot>();
}

});
_ninjectKernel.Bind<Func<string, IRobot>>().ToConstant(factoryMethod);

您的导航服务可能如下所示:

    public class RobotNavigationService
{
public RobotNavigationService(Func<string, IRobot> robotFactory)
{
var killer = robotFactory("Maximilian");
var standard = robotFactory("");
}
}

当然,这种方法的问题是您在 IoC 初始化中编写工厂方法——也许不是最好的权衡...

工厂扩展试图通过为您提供几种基于约定的方法来解决这个问题 - 从而允许您通过添加上下文相关的依赖项来保留正常的 DI 链接。

关于c# - IoC (Ninject) 和工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com