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

标签 .net dependency-injection ninject factory-pattern

我有一个 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/

相关文章:

dependency-injection - 如何在 Symfony2 的 webtestcases 中获取 EntityManager

dependency-injection - 使用 StructureMap 时是否有方法检测和调试循环引用?

events - bbvEventBroker 强类型且没有魔法字符串

c# - 如何在 string.Format 中引用数组值?

c# - HttpUtility.ParseQueryString 不解码特殊字符

c# - 如何隐藏数据表中的列

c# - 科学计数法 - .NET 中的错误?

c# - Typedefs、C++/CLI、C# + 依赖注入(inject)

asp.net - Ninject 的 N 层 Web 应用程序示例?

c# - 忍者。将所有接口(interface)绑定(bind)到单例范围内的同一个类