2013-04-26 17 views
5

Rozpocząłem pracę nad nowym projektem i pochodzę z bezpośredniego i "naiwnego" programowania.Implementacja wtrysku zależności Autofac

W tej chwili mam zamiar używać kontenera IoC, a konkretnie tupu Dependency Injection, używając Autofac.

Powiedzmy mam proste fabryki sesji:

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(); 
     } 
    } 
} 

I Bootstrap.cs, skonfigurować autofac tak:

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(); 
     } 
    } 
} 

Moje pytanie jest takie:

  1. Jak używać Autofac do rozwiązywania zależności SessionFactory od ISystemSetting? Czy muszę używać parametru builder.Resolve<ISystemSetting> jako parametru za każdym razem, gdy chcę korzystać z SessionFactory?
  2. Wzorzec zależności Dependency Injection, a może po prostu Autofac, zawiera wiele nowych słów, takich jak Service, Resolve, Singleton itp. Gdzie mogę nauczyć się tych rzeczy od zera? Czy jest tak samo w przypadku wszystkich innych struktur DI?
  3. Muszę zrozumieć, w jaki sposób IoC Container działa w projekcie z wieloma warstwami, czy każda warstwa wymaga odniesienia do Autofac?

Dziękuję.

+0

co ja nie rozumiem w przykładzie, to SessionFactory, ponieważ zawiera również „statyczny ISessionFactory _sessionFactory;”. więc obudowujesz środowisko sesji w fabryce sesji? wydaje mi się, że chcesz zrobić zajęcia sesyjne. – Egi

Odpowiedz

8
  1. zrobiłeś to już w swoim bootstrapie.

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

    oznacza to, że każdy plik o zależnościach od ISystemSettings otrzymuje instancję SystemSettings. więc jeśli używasz

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

    gdzieś w kodzie (naprawdę powinien zrobić w swoim składzie korzeń) pojemnik będzie wykonać zadanie dla Ciebie. Jeśli masz dużo obiektów, z wieloma zależnościami zaczniesz rozumieć, dlaczego kontenery IoC są "magiczne";)

  2. oraz .. wiele kontenerów IoC używa słowa "postanowienie". oznacza to po prostu "daj mi obiekt ze swoimi zależnościami". usługi i singleton to słowa z obiektu Laguage projektowania obiektowego. nie są specyficzne dla kontenerów IoC. możesz je podnieść. Myślę, że nie ma podsumowania dla takich rzeczy. dostaniesz to na czas czytając książki, artykuły i przechodząc przez samouczki.

  3. nie. w rzeczywistości to byłoby nie do zniesienia. istnieje wzorzec dla tego zwanego servicelocator, który jest uważany przez niektórych ludzi za antipattern. jeśli podążysz za tym wzorem, wszystkie twoje obiekty mają dokładnie jedną zależność, kontener! i oni sami wydostają się z tego, czego potrzebują.

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

    ... w tym przypadku swoją pojemnik będzie działać jako ServiceLocator i każdego obiektu, który potrzebuje zależność byłoby zapytać ServiceLocator aby ta zależność. który podważyłby całą wartość INWERSJI kontroli i uczyniłby twoje obiekty zależnymi od kontenera. wstrzyknąć to, czego rzeczywiście potrzebują obiekty, a nie to, czego potrzebują, aby zlokalizować to, czego potrzebują, aby twoje obiekty mogły być agnostyczne dla kontenerów.i używaj swojego kontenera w katalogu głównym kompozycji, w którym przyklejasz razem obiekty i warstwy aplikacji. tu coś do czytania: http://blog.ploeh.dk/2011/07/28/CompositionRoot/

Powiązane problemy