2013-04-26 153 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/