有没有人有IoC容器的好例子(最好是在c#中),以及如何和为什么使用它们?我已经查看了wiki page和Ayende's示例,但我还不太了解它的概念。
我应该在何时何地使用IoC容器?
发布于 2009-04-20 21:14:01
我已经用过很多次StructureMap了。你的问题的其余部分是相当有意义的。我将试着用一个例子来解释这个概念。
假设您创建了一个将通过PayPal接受付款的网站。PayPal现在是一个依赖项。但是您不希望针对特定的PayPal提供程序进行编码。
相反,您可以针对如下所示的接口创建和编码:
interface IPaymentProcessor
{
bool ProcessPayment(amount, ....);
}您所有的PayPal代码都将驻留在一个实现接口方法的类中-例如,PayPalPaymentProcessor。
现在您有了一个对象,您将实际使用它来处理付款。这可以是一个控制器(ASP.NET-MVC,ViewModel-WPF),也可以只是一个类,如下所示:
class PaymentProcessor
{
private IPaymentProcessor _processor = null;
public PaymentProcessor(IPaymentProcessor processor)
{
_processor = processor;
}
public bool ProcessTransaction(Transaction trans)
{
_processor.ProcessPayment(trans.amount, ...);
}
}这就是IoC容器发挥作用的地方。您可以让IoC容器注入依赖项,而不是手动调用构造函数:
PaymentProcessor processor = ObjectFactory.GetInstance<PaymentProcessor>();这段代码告诉StructureMap“只要你看到一个需要IPaymentProcessor的构造函数,就返回一个新的PayPalPaymentProcessor”。
ObjectFactory.Initialize(x =>
{
x.ForRequestedType<IPaymentProcessor>().TheDefaultIsConcreteType<PayPalPaymentProcessor>();
});所有这些映射都独立于您的实现代码,您可以在以后交换这些映射,只需要很少的重构。关于IoC容器还有很多东西,但这是基本的概念。您可以自动化构造函数的注入,以避免直接调用ObjectFactory。
希望这能有所帮助!
发布于 2009-08-07 14:09:53
请注意IOC容器的以下限制。我必须警告人们,因为我生活在地狱中,不得不支持一个使用它的系统:
由构造函数抛出的
的上下文中
不要误解我的意思,我喜欢依赖注入和控制反转原则,但我认为IOC容器可以被负责任地使用,但请注意,由于上面的列表,您将需要进行战斗。
发布于 2009-04-20 22:09:49
如果你想了解IoC容器的背后,以及它的要点(依赖注入),在DNR (Episode 126)上有一个很棒的播客,它详细介绍了如何创建它们,为什么你需要它们。这是一个非常棒的播客。一旦你看过这个视频,你就可以看到Unity,Ninject,StructureMap等,并能够理解他们在做什么
https://stackoverflow.com/questions/770039
复制相似问题