2012-11-20 16 views
1

我正在從結構映射切換到Autofac。我已經使用來自斯科特·米利特的書ASP.net設計模式緩存模式,它實現了兩個緩存並根據構造函數的參數名稱在適當的對象存儲庫和交換機的接口將緩存模式從結構映射轉換爲AutoFac

界面看起來像這樣

public interface ISchemeRepository 
{ 
     List<Scheme> GetSchemes(); 
} 

緩存對象看起來像這樣

public class SchemeRepository : BaseRepository, ISchemeRepository 
{ 
/*************************************************************** 
* Properties 
***************************************************************/ 

私人只讀ISchemeRepository schemeRepository;

/*************************************************************** 
* Constructors 
***************************************************************/ 
public SchemeRepository() 
    : this(ObjectFactory.GetInstance<ISchemeRepository>(), ObjectFactory.GetInstance<IConfigurationSetting>()) 
{ 
} 

public SchemeRepository(ISchemeRepository realSchemeRepository, IConfigurationSetting configurationSetting) 
{ 
    schemeRepository = realSchemeRepository; 
    this.configurationSetting = configurationSetting; 
} 

/************************************************************** 
* Methods 
***************************************************************/ 
public List<Scheme> GetSchemes() 
{ 
    string key = Prefix + "Schemes"; 

    if (!MemoryCache.Default.Contains(key)) 
    { 
     MemoryCache.Default.Add(key, schemeRepository.GetSchemes(), new CacheItemPolicy()); 
    } 

    return (List<Scheme>)MemoryCache.Default.Get(key); 
} 

}

的庫看起來像是這樣

public class SchemeRepository : BaseLocalRepository, ISchemeRepository 
    { 
     /*************************************************************** 
     * Properties 
     ***************************************************************/ 
     private readonly IConnectionSetting connectionSetting; 

     /*************************************************************** 
     * Constructors 
     ***************************************************************/ 
     public SchemeRepository() 
      : this(ObjectFactory.GetInstance<IConnectionSetting>()) 
     { 
     } 

     public SchemeRepository(IConnectionSetting connectionSetting) 
     { 
      this.connectionSetting = connectionSetting; 
     } 

     /************************************************************** 
     * Methods 
     ***************************************************************/ 
     public List<Scheme> GetSchemes() 
     { 
      var response = new List<Scheme>(); 

      var conn = new SqlConnection(connectionSetting.CQBConnectionString); 
      var command = new SqlCommand("proc_GetSchemes", conn) { CommandType = CommandType.StoredProcedure }; 

      conn.Open(); 
      var reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       response.Add(
         new Scheme 
         { 
          SchemeId = reader["Scheme_Id"].ToString().Trim(), 
          GuaranteeText = reader["Guarantee_Text"].ToString().Trim() 
         } 
        ); 
      } 
      conn.Close(); 

      return response;   
     } 


    } 

結構圖通話低於

InstanceOf<Repository.Local.Contract.IProviderRepository>().Is.OfConcreteType<Repository.Local.Core.ProviderRepository>().WithName("RealProviderRepository"); 

ForRequestedType<Repository.Local.Contract.IProviderRepository>().TheDefault.Is.OfConcreteType<Repository.Local.Cache.ProviderRepository>().CtorDependency<Repository.Local.Contract.IProviderRepository>().Is(x => x.TheInstanceNamed("RealProviderRepository")); 

結構圖着眼於構造函數,如果它包含一個參數調用「realSchemeRepository」然後它實現連接到數據庫的對象,如果沒有的話它實現了檢查緩存並在緩存中沒有任何內容並調用緩存的情況下調用數據庫的緩存對象。

我如何在Autofac中做到這一點? Autofac中有更好的方法嗎?

回答

2

我相信你要問怎麼做是在你的兩個存儲庫類之間建立一個裝飾器。我會假裝兩個類名是CacheSchemeRepository和RealSchemeRepository,因爲命名它們完全相同是令人困惑和可怕的。無論如何...

builder.Register(c => new RealSchemeRepository(c.Resolve<IConnectionSetting>()) 
     .Named<ISchemeRepository>("real"); 

builder.RegisterDecorator<ISchemeRepository>(
    (c, inner) => new CacheSchemeRepository(inner, c.Resolve<IConfigurationSetting>()), 
    "real");