首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IoC容器示例

IoC容器示例
EN

Stack Overflow用户
提问于 2009-04-20 20:51:43
回答 9查看 54.8K关注 0票数 46

有没有人有IoC容器的好例子(最好是在c#中),以及如何和为什么使用它们?我已经查看了wiki pageAyende's示例,但我还不太了解它的概念。

我应该在何时何地使用IoC容器?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-04-20 21:14:01

我已经用过很多次StructureMap了。你的问题的其余部分是相当有意义的。我将试着用一个例子来解释这个概念。

假设您创建了一个将通过PayPal接受付款的网站。PayPal现在是一个依赖项。但是您不希望针对特定的PayPal提供程序进行编码。

相反,您可以针对如下所示的接口创建和编码:

代码语言:javascript
复制
interface IPaymentProcessor
{
    bool ProcessPayment(amount, ....);
}

您所有的PayPal代码都将驻留在一个实现接口方法的类中-例如,PayPalPaymentProcessor

现在您有了一个对象,您将实际使用它来处理付款。这可以是一个控制器(ASP.NET-MVC,ViewModel-WPF),也可以只是一个类,如下所示:

代码语言:javascript
复制
class PaymentProcessor
{
    private IPaymentProcessor _processor = null;
    public PaymentProcessor(IPaymentProcessor processor)
    {
        _processor = processor;
    }

    public bool ProcessTransaction(Transaction trans)
    {
       _processor.ProcessPayment(trans.amount, ...);
    }
}

这就是IoC容器发挥作用的地方。您可以让IoC容器注入依赖项,而不是手动调用构造函数:

代码语言:javascript
复制
PaymentProcessor processor = ObjectFactory.GetInstance<PaymentProcessor>();

这段代码告诉StructureMap“只要你看到一个需要IPaymentProcessor的构造函数,就返回一个新的PayPalPaymentProcessor”。

代码语言:javascript
复制
ObjectFactory.Initialize(x =>
{ 
    x.ForRequestedType<IPaymentProcessor>().TheDefaultIsConcreteType<PayPalPaymentProcessor>();
});

所有这些映射都独立于您的实现代码,您可以在以后交换这些映射,只需要很少的重构。关于IoC容器还有很多东西,但这是基本的概念。您可以自动化构造函数的注入,以避免直接调用ObjectFactory

希望这能有所帮助!

票数 59
EN

Stack Overflow用户

发布于 2009-08-07 14:09:53

请注意IOC容器的以下限制。我必须警告人们,因为我生活在地狱中,不得不支持一个使用它的系统:

由构造函数抛出的

  • 异常会被吞噬。你只会得到“无法创建依赖项”异常。这意味着如果在运行时而不是在编译时通过constructors.
  • Forgetting的constructor.
  • Can’t步骤来注册接口中断,你就不能捕获预期的异常。parameters.
  • All
  • 所有的类只能有一个构造函数,它们都必须接受接口,因为parameters.
  • All依赖关系是实例化的,所以你不能共享实例,这意味着你的内存使用量可能很快就会变大。
  • 它促进了许多相互依赖,这可能会隐藏你的代码已经变成意大利面的事实。简化所有这些依赖关系的实例化只是掩盖了潜在的潜在问题。
  • 你不能很容易地管理你自己的“工作单元”,因为你不能跨多个依赖关系管理一个事务,因为你不能控制它们的实例化和传递到那个transaction.

的上下文中

不要误解我的意思,我喜欢依赖注入和控制反转原则,但我认为IOC容器可以被负责任地使用,但请注意,由于上面的列表,您将需要进行战斗。

票数 24
EN

Stack Overflow用户

发布于 2009-04-20 22:09:49

如果你想了解IoC容器的背后,以及它的要点(依赖注入),在DNR (Episode 126)上有一个很棒的播客,它详细介绍了如何创建它们,为什么你需要它们。这是一个非常棒的播客。一旦你看过这个视频,你就可以看到UnityNinjectStructureMap等,并能够理解他们在做什么

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/770039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档