2013-04-26 180 views
5

我開始研究一個新項目,我來自一個直接和'天真'編程。Autofac依賴注入實現

現在我正在關注使用IoC容器,特別是使用Autofac的依賴注入模式。

比方說,我有一個簡單的會話工廠:

namespace Warehouse.Data 
{ 
    public class SessionFactory 
    { 
     private static ISessionFactory _sessionFactory; 
     private static ISystemSetting _systemSetting; 

     SessionFactory(ISystemSetting systemSetting) 
     { 
      _systemSetting = systemSetting; 

      InitializeSessionFactory(); 
     } 

     private static void InitializeSessionFactory() 
     { 
      _sessionFactory = Fluently.Configure() 
       .Database(DatabaseConfiguration) 
       .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyMap>()) 
       .BuildSessionFactory(); 
     } 

     public static ISession OpenSession() 
     { 
      return _sessionFactory.OpenSession(); 
     } 
    } 
} 

而在Bootstrap.cs,我配置autofac這樣的:

namespace Warehouse.Infrastructure 
{ 
    using Autofac; 

    public class Bootstrap 
    { 
     public IContainer Configure() 
     { 
      var builder = new ContainerBuilder(); 

      builder.RegisterType<SystemSetting>().As<ISystemSetting>(); 
      builder.RegisterType<UserRepository>().As<IUserRepository>(); 

      return builder.Build(); 
     } 
    } 
} 

我的問題是這樣的:

  1. 我如何使用Autofac將SessionFactory依賴項解析爲ISystemSetting? 每當我想使用SessionFactory時,是否需要使用builder.Resolve<ISystemSetting>作爲參數?
  2. 依賴注入模式,或者也許只是Autofac,帶有很多新的單詞,如Service,Resolve,Singleton等。我從哪裏可以從頭開始學習這些東西?每個其他DI框架都一樣嗎?
  3. 我需要了解IoC容器如何在具有多層的項目中工作,每層都需要對Autofac的引用嗎?

謝謝。

+0

什麼我不明白你的榜樣,是SessionFactory的,因爲它也包含了「靜態ISessionFactory _sessionFactory;」。所以你在會話工廠中封裝一個sessionfactory?在我看來,你想舉辦一個會議課。 – Egi 2013-05-08 12:24:09

回答

8
  1. 你已經在你的引導程序中完成了它。

    builder.RegisterType<SystemSetting>().As<ISystemSetting>(); 
    

    這意味着,每一個對ISystemSettings依賴oject得到SystemSettings的一個實例。所以,如果你在代碼中使用

    var mySessionFactory = myContainer.Resolve<SessionFactory>(); 
    

    地方(你真正應該做的是,在你的作文根)容器會爲你做這項工作。如果你有很多的對象,有多個依賴關係,你會開始明白爲什麼IoC容器是「神奇」的;)

  2. 好吧..許多IoC容器使用單詞resolve。它只是意味着「給我一個對象的依賴」。 服務和單例是來自面向對象設計語言的單詞。它們並不特定於IoC容器。你可以谷歌他們了。我認爲沒有像這樣的東西的總結。你會通過閱讀書籍,文章和教程來及時得到它。

  3. 沒有。實際上這將是一個不行。有一種被稱爲servicelocator的模式被某些人認爲是反模式。如果你遵循這個模式,你的所有對象都只有一個依賴項,容器!他們自己擺脫了他們需要的東西。

    public class MyClass 
    { 
        private DependencyOne dep1; 
    
        public MyClass(WhatEverContainer container) 
        { 
         dep1 = container.Resolve<DependencyOne>(); 
        } 
    } 
    

    ...在這種情況下你的容器將作爲一個服務定位和需要的依賴會要求服務定位來獲取依賴每個對象。 這會破壞控制反轉的全部價值,並使您的對象依賴於容器。注入物體實際需要的東西,而不是他們需要的東西以便找到他們真正需要的東西; D

    讓您的對象成爲容器不可知的。並在你的組合根目錄中使用你的容器,這就是你將應用程序的對象和圖層粘合在一起的地方。這裏的東西閱讀:http://blog.ploeh.dk/2011/07/28/CompositionRoot/