2012-11-20 1 views
1

구조 맵에서 Autofac으로 전환 중입니다. 나는 모두 캐시와 생성자의 매개 변수 이름에 따라 적절한 오브젝트의 저장소 및 스위치에 대한 인터페이스를 구현 스콧 밀레의 책 ASP.net 디자인 패턴에서 캐싱 패턴을 사용했습니다 인터페이스이Structure Map에서 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"); 
관련 문제