c# - IoC 容器示例

标签 c# inversion-of-control

<分区>

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

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

最佳答案

我用过 StructureMap相当多。你的问题的其余部分非常多。我将尝试在示例中解释这个概念。

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

相反,您将针对这样的界面进行创建和编码:

interface IPaymentProcessor
{
    bool ProcessPayment(amount, ....);
}

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

现在您有了一个实际用于处理付款的对象。这可以是 Controller (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 容器注入(inject)依赖项:

PaymentProcessor processor = ObjectFactory.GetInstance<PaymentProcessor>();

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

ObjectFactory.Initialize(x =>
{ 
    x.ForRequestedType<IPaymentProcessor>().TheDefaultIsConcreteType<PayPalPaymentProcessor>();
});

所有这些映射都与您的实现代码分开,您可以在以后更换它们,几乎不需要重构。 IoC 容器还有很多内容,但这是基本概念。您也可以自动注入(inject)构造函数以避免直接调用 ObjectFactory

希望这对您有所帮助!

关于c# - IoC 容器示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/770039/

相关文章:

c# - 当我调用 OpenFileDialog 的 ShowDialog 方法时,vshost32.exe 已停止工作

c# - 生成随机 boolean 值的最快方法

c# - 如何在没有 Windows 窗体的情况下接收即插即用设备通知

java - 为什么Spring中的作用域会影响Spring中类的加载

PHP IoC 交叉依赖

c# - 无法等待异步扩展方法

c# - 在 C# 中的 RESTfull/HTTP 请求中添加 header 和发布数据

c# - 是否可以使用IOC来解析viewengine?

c# - 我应该如何正确测试 IoC 服务?

spring - @Inject 和 @Autowired 有什么区别