原文:http://www.bkjia.com/Asp_Netjc/888119.html? 【原文中有一個地方報錯,下面已修改】
一.基本步驟:
1.設計適合控制反轉(IoC)的應用程序
2.給應用程序Autofac?引用.
3.注冊組件.
4.創建一個Container以備后用.
5.從Container創建一個 lifetime scope .
6.使用這個Lifetime Scope?來解析組件的實例.
二.詳細介紹:
1.什么是控制反轉?
控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題。 控制反轉還有一個名字叫做依賴注入(Dependency Injection)。簡稱DI。IoC就是IoC,不是什么技術,與GoF一樣,是一種 設計模式。
Interface Driven Design接口驅動,接口驅動有很多好處,可以提供不同靈活的子類實現,增加代碼穩定和健壯性等等,但是接口一定是需要實現的,也就是如下語句遲早要執行:AInterface a = new AInterfaceImp(); 這樣一來,耦合關系就產生了;而采用了IoC之后,我們的就把創建接口的一個實例交給IoC容器.從而實現了解耦.
所以我們在編程的時候的原則之一就是"針對接口編程",這里的"接口"不是指一要是個接口類型,它可以是C#語言中的接口類型,也可以一個具體的父類.
public interface ILcService{string ServiceName { get; }}public class LcService:ILcService{public string ServiceName{get;set;}}
2.怎么添加Autofac的引用?
? 1)我們可以到Autofac官網下載dll文件,然后在Visualstudio的項目中添加引用
?
?? 2)也可以使用NuGet?安裝autofac包.
?3.怎樣注冊組件?
? 在Autofac中,我們使用一個ContainerBuilder類的實例來注冊我們的我們的組件.?Autofac提供了Register方法家族,方便我們注冊組件.
ContainerBuilder builder = new ContainerBuilder();//builder.RegisterType<ILcService>().As<LcService>().InstancePerDependency();
//此處報錯: The type 'AutofacIocApp.ILcService' is not assignable to service 'AutofacIoc’
//原文中注冊順序寫反了, AnIDynamicQuery
is not aDynamicQuery
but aDynamicQuery
IS anIDynamicQuery
.
builder.RegisterType<LcService>().As<ILcService>().InstancePerDependency();
4.創建一個Container以備后用.
直接調用ContainerBuilder類實例的build()即可.
var container = builder.Build();
5.創建一個Lifetime Sope.
var lifetimescope = container.BeginLifetimeScope();
6.得到我們需要的的實例.
ILcService service = lifetimeScope.Resolve<ILcService>();
?
我們可以在最后看的出來,使用了IoC之后,就符合設計模式中要求的"針對接口編程,不針對實現編程";創建實例不是使用New關鍵字創建,而是創建實例的工作交給了IoC容器,這就實現了關系解耦,可以在IoC容器中隨便的替換具體的實現類了.
? ? ?還有個問題就是"為什么不直接從Container中直接解析出具體的實例,而要創建一個LifetimeScope,再從它里面解析?"
?這個就是考慮到內存泄露問題.? LifetimeScope用完了,就釋放了,它里面的實例也跟著釋放了,就不會出現內存泄露,Container是個root ,永遠不會釋放,如果他里面存在實例.就有可能存在內存泄露問題.