(从 StockTraderRIBootstrapper.cs 文件在棱镜V2StockTrader例应用程序)

之间的区别是什么:

ShellPresenter presenter = new ShellPresenter();

和这个:

ShellPresenter presenter = Container.Resolve<ShellPresenter>();
  • 我理解的第二个例子是治疗的容器的工厂,走起来就说"我需要一个实例类型的对象ShellPresenter".
  • 但是,如果,例如我需要送的参数,什么是相当于"新ShellPresenter(1,true)"等?
  • 和由于容器已被告知有关ShellPresenter,我预期的要找个地方在该项目的一个地方的ShellPresenter类登记的容器,例如我期待

事情是这样的:

Container.RegisterType<IShellPresenter, ShellPresenter>();

却发现它无处。那么,如何容器的要知道有关这些类型,所以它可以。解决他们吗? 我重建了这个在其自己的项目,并得到一个"解决方案的依赖关系失败的"错误, ,我在哪里需要注册这种依赖性,然后呢?

任何方向/这里的讨论将是有益的。

原因不明的答案:

因此,在引导程序,当我登记册壳本身:

protected override void ConfigureContainer()
{
    Container.RegisterType<IShellView, Shell>();
    base.ConfigureContainer();
}

然后容器可以解决的ShellPresenter类型。所以是怎样的 ShellPresenter 类型的登记,当我登记的 外壳 的类型?

令人惊讶的答复:

好了,事实证明,你没有注册的类型你是在试图解决但是 你做的已注册的参数(接口)的类型,通过构造的类型你们试图要解决, 即因为我注射IShellView接口进入我的ShellPresenter的构造,我需要注册IShellView类型和不IShellPresenter类型:

public ShellPresenter(IShellView view) ...

我测试了这个,试图解决的类型 测试仪:

Tester tester = Container.Resolve<Tester>();

只要我一注射 SomeClass 成其构造:

public Tester(ISomeClass someClass)

我得到解决依赖错误,直到我寄存器 SomeClass 与容器:

Container.RegisterType<ISomeClass, SomeClass>();

然后它的工作。这是令人惊讶,因为它是教育。需要。我要去拿咖啡,并认为关于这一段时间。

如果任何人都可以详细说明为什么是这种情况,它将不胜感激。

有帮助吗?

解决方案

你了解的基本知识。

有过载用于解决类型,需要构造的论点。或者,你总是可以代码类型的有无参构造。

点DI容器是,你可以将它们配置变化的类型,得到解决为一个特定的界面没有重新编译软件。代码如你提供的,用于配置的提供者不能改变在运行时间。这就是为什么大多数依赖注射器能让你配置它们在应用程序。config/网络。config/其他一些外部的配置文件。这样你可以重新配置程序注入一个不同的类型,而无需重新编译,这是真正的力量迪框架,如统一。

其他提示

如果你试图解决一个具体的类和未注册的一个实例或亚类,以满足它,然后统一将建立的一个实例的具体类对于你,解决任何的依赖。

所以当你问ShellPresenter,并没有注册、统一只新的立一个ShellPresenter为你与ShellView作为一个参数。

好吧,我可以不回答Untiy,但对于温莎城堡,登记可能会在应用程序。config/网络。配置文件。也有能力增加的参数设置xml。

这可以让你改变的实施和配置的对象,而不必重新编译你的应用程序。

在团结,确实是有一个 Container.RegisterType<TFrom, TTo>() 方法设置寄存器的类型在运行时间。它可能更常见的做使用XML文件的配置,而无论运作的。

有趣的是,在团结,没有 Container.Resolve<T>(params object[] parameters) -类型的方法来解决类型的具体构造的参数值。团结是建立在ObjectBuilder其是在P&P队的图书馆做的对象,建设和连接(请参考它最初是为ObjectSpaces但已显着增强,现在)。ObjectBuilder能力,使你能够注入的依赖的各种方式,包括通过构造,所以你可以说-例如-你将通过一个新的类型的实例是依赖成本构造的了解决类型;但是,这种类型还必须注册。你也可以通过实例的登记类型(一个注册的实例/单等)。但AFAICS有没有办法简单地给这一价值通过。

我认为这样做会违背的理念IoC某种程度上,这就是为什么他们不提供这种设施。容器应在理论上,能够给你一个完整的对象图在任何给定的情况下,这样你就不应该通过的参数,并且做你的对象的依赖构造参数比其他注射对象的依赖关系(该容器将解决为您)被看作为不良的设计。

我不能说为温莎,StructureMap或其他人,这可以允许你来做到这一点。我甚至不能说明确指出,统一有没有办法做到因为我是合理的新在它,但是请参考克里斯*塔瓦雷斯-谁基本上建立团结-悬挂在这里的时间,所以也许他就会下降和回答这个:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top