2014-07-18 27 views
2

我是Autofac和IOC概念的新手。我有以下代碼,我沒有得到或理解它在做什麼。AutoFac IRegistrationBuilder

`

public void AddComponentInstance<TService>(object instance, string key = "",        ComponentLifeStyle lifeStyle = ComponentLifeStyle.Singleton) 

    { 

     AddComponentInstance(typeof(TService), instance, key, lifeStyle); 
    } 

public void AddComponentInstance(Type service, object instance, string key = "",ComponentLifeStyle lifeStyle = ComponentLifeStyle.Singleton) 
    { 
     UpdateContainer(x => 
     { 
      var registration = x.RegisterInstance(instance).Keyed(key, service).As(service).PerLifeStyle(lifeStyle); 
     }); 
    } 

public void UpdateContainer(Action<ContainerBuilder> action) 
{ 

var builder = new ContainerBuilder(); 
     action.Invoke(builder); 
     builder.Update(_container); 

} 



public static class ContainerManagerExtensions 

{ 


public static Autofac.Builder.IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> PerLifeStyle<TLimit, TActivatorData, TRegistrationStyle>(this Autofac.Builder.IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> builder, ComponentLifeStyle lifeStyle) 
    { 

switch (lifeStyle) 
     { 


      case ComponentLifeStyle.LifetimeScope: 
       return HttpContext.Current != null ? builder.InstancePerHttpRequest() : builder.InstancePerLifetimeScope(); 
      case ComponentLifeStyle.Transient: 
       return builder.InstancePerDependency(); 
      case ComponentLifeStyle.Singleton: 
       return builder.SingleInstance(); 
      default: 
       return builder.SingleInstance(); 
     } 
    } 
} 

` 從上面的代碼我的理解是,我們正在註冊的Singleton實例集裝箱,我們正在更新容器。我在網上搜索IRegistrationBuilder接口的例子,但我無法得到任何滿意的答案。

任何人都可以請幫我理解IRegistrationBuilder的概念。

我指的是來自NopCommerce應用程序的這段代碼。 在此先感謝。

回答

0

IRegistrationBuilder是構建器設計模式在autofac中的應用。看線:

x.RegisterInstance(instance).Keyed(key, service).As(service).PerLifeStyle(lifeStyle); 

這個方法鏈定義某個對象的istance的登記。每個使用的方法都會設置用於正確註冊的屬性。每個方法都返回實現IRegistrationBuilder的構建器對象 - 它擁有所有這些屬性。由於PerLifeStyle接受IRegistrationBuilder作爲第一個參數,因此可以在上面的鏈中使用它來更改構建器屬性 - 以PerLifeStyle爲例來影響對象的實例化。由於PerLifeStyle返回IRegistrationBuilder,您可以在方法調用鏈中使用它,如:

x.RegisterInstance(instance).PerLifeStyle(lifeStyle).Keyed(key, service).As(service)