Jab*_*Jab 57
我已经使用了StructureMap了.你问的其余部分非常重要.我将尝试在一个例子中解释这个概念.
假设您创建了一个可以通过PayPal接受付款的网站.PayPal现在是一个依赖.但您不希望针对特定的PayPal提供商进行编码.
相反,您将创建和编码这样的接口:
interface IPaymentProcessor
{
bool ProcessPayment(amount, ....);
}
Run Code Online (Sandbox Code Playgroud)
例如,您的所有PayPal代码都将驻留在实现接口方法的类中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, ...);
}
}
Run Code Online (Sandbox Code Playgroud)
这是IoC容器的用武之地.您可以让IoC容器注入依赖项,而不是手动调用构造函数.
PaymentProcessor processor = ObjectFactory.GetInstance<PaymentProcessor>();
Run Code Online (Sandbox Code Playgroud)
这段代码告诉StructureMap"任何时候你看到一个需要的构造函数IPaymentProcessor,返回一个新的PayPalPaymentProcessor".
ObjectFactory.Initialize(x =>
{
x.ForRequestedType<IPaymentProcessor>().TheDefaultIsConcreteType<PayPalPaymentProcessor>();
});
Run Code Online (Sandbox Code Playgroud)
所有这些映射都与您的实现代码分开,您可以在以后更换这些映射,只需要很少的重构.IoC容器还有很多,但这是基本概念.您可以自动注入构造函数以避免直接调用ObjectFactory.
希望这可以帮助!
小智 23
请注意IOC容器的以下限制.我必须警告人们,因为我生活在必须支持使用它的系统的地狱:
不要误会我的意思,我喜欢依赖注入和控制原理的反转,但我认为IOC容器可以负责任地使用,但是请注意由于上面的列表你需要战斗的战斗.
如果你想看到一个IoC容器,还有点(依赖注入),DNR TV(第126集)上有一个很棒的播客,它真正详细介绍了如何创建它们,为什么你需要它们.这是一个非常精彩的播客.一旦你看了这个视频,你就可以看看Unity,Ninject,StructureMap等,并且能够理解他们在做什么