gpt4 book ai didi

.net - 如何在不使用服务定位器模式的情况下使用具有依赖注入(inject)的工厂

转载 作者:行者123 更新时间:2023-12-01 07:29:42 25 4
gpt4 key购买 nike

我有一个 GUI 应用程序。在其中,我允许用户从容器提供的算法列表中进行选择。每个算法将在另一个 View 中作为后台任务启动。我需要支持这个 View 的多个实例,并且支持同一个算法的多个实例。该 View 也将由容器提供。该算法也是有状态的。

所以我有一个案例,我需要创建我的 View 和算法的实例并在运行时将它们绑定(bind)在一起。我没有这些实例的静态绑定(bind)点,所以我不能使用正常的注入(inject)工具(构造函数或属性注入(inject))。我不想打电话 new ,我不想像 Service Locator 那样使用容器.

我在 CaSTLe.Windsor 中用 Typed Factory Facility 解决了这个问题,但我不得不在我的应用程序中处理工厂。工厂设计也有点奇怪,因为我必须在完成实例后将它们返回工厂。

我现在正在考虑使用 NInject,因为到目前为止学习曲线和介绍文档要好得多,我想提出一个容器供我的团队使用。但是对于这样的场景,我认为我必须编写自己的工厂并直接调用内核来解析新实例(工厂中嵌入的服务定位器),以及在我的注册代码中添加工厂方法。

有没有通用的方法来解决这个问题,或者这仅仅是依赖注入(inject)本身没有设计解决的问题?

澄清:

我在评论中说我想要 Ninject 的具体答案,我已经得到了。非常感谢 :) 在现实生活中,我可能只会使用已经提出的务实解决方案。

但是我把我的基础作为一个具体的问题来解决我的问题。我希望对我标题中的问题有一个更纯粹的基本答案。

是否有一种纯 DI 技术允许用户在运行时触发组件的新实例?或者所有这些实现都将容器用作服务定位器,或者需要容器的特定“怪癖”(例如内置工厂支持,ala CaSTLe.Windsor 或即将发布的 Ninject 工厂功能),而不是而不是只利用“纯”DI的各个方面?

我只从 Java 世界听到过这个词,我不太了解它的含义 - 所以请原谅我 :) 我在寻找某种“外射”吗?

最佳答案

最好创建这样的工厂界面

public interface IFooFactory
{
IFoo CreateFoo(int someParameter);
}

Ninject 2.3 见 https://github.com/ninject/ninject.extensions.factory并通过添加以下配置让它由 Ninject 实现。
Bind<IFooFactory>().AsFactory();

对于 2.2,请自己执行。此实现是容器配置的一部分,而不是您的实现的一部分。
public class FooFactory: IFooFactory
{
private IKernel kernel;
public FooFactory(IKernel kernel)
{
this.kernel = kernel;
}

public ISession CreateFoo(int someParameter)
{
return this.kernel.Get<IFoo>(
new ConstructorArgument("someParameter", someParameter));
}
}

关于.net - 如何在不使用服务定位器模式的情况下使用具有依赖注入(inject)的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8166696/

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