2012-11-20 18 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");