High-level modules should not depend on low-level modules. Both should depend on abstractions.
Abstractions should not depend upon details. Details should depend upon abstractions.
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacePlug_in1{/* * Dependency inversion principle: * 1.High-level modules should not depend on low-level modules. Both should depend on abstractions. * 2.Abstractions should not depend upon details. Details should depend upon abstractions. */// Interface implementing Ioc DIpublicinterfaceIInversion{voidInvert(stringmessage);}// classclassIoc{//privateIInversioninv=null;// Property InjectionpublicIInversionAction{get{returninv;}set{inv=value;}}//Default publicIoc(){/*Default const*/}// Constructor Injection publicIoc(IInversioninv01){this.inv=inv01;}// Method InjectionpublicvoidChange(IInversionconcreteInversion,stringmessage){this.inv=concreteInversion;if(inv!=null)inv.Invert(message);}//methodpublicvoidChange(stringmessage){if(inv!=null)inv.Invert(message);}}// First inverted functionclassInvertedFunc1:IInversion{publicvoidInvert(stringmessage){Console.WriteLine("message: {0}",message);}}classmain{publicvoidRun(string[]arg){Ioci=newIoc(newInvertedFunc1());i.Change("Adidas");}}}