2013-10-23 4 views
4

내 응용 프로그램의 (거의) 모든 POCO 클래스에 대한 마스터 기본 클래스가 있습니다.Redis, key 또는 Id를 사용하여 객체 식별자 저장?

public abstract class AceOfBase 
{ 
    public long Id { get; set; } 
    public DateTimeOffset CreatedOn { get; set; } 
    public string Key { get; set; } 
} 

내 주요 클래스 (Member , Building, Community, etc.)의 일부 속성의 공정한 금액 나는 ServiceStack'sStrongly-Typed Client가 제공하는 간편한 관리 활용 계획 그래서 있습니다.

From the research I've done는 클라이언트가 생성 키

에 대한 구조화 된 방법을 사용하는 것

은 기본적으로 포항 강판은 대해서 typeof 모두 직렬화 된 JSON로 레디 스에 저장됩니다 (마시고) .NAME와 ID가 고유 키를 형성하기 위해 사용 그 인스턴스. 예 :

항아리 : 마시고 : {ID} => '{ "ID": 1, "푸": "바"}'나는 객체를 검색 할 수 있기 때문에 시간에

그 상속 기본 클래스 (하지만 컴파일 타임에 파생 클래스를 알지 못함) 어떻게하면 객체를 쉽게 얻을 수 있도록 키를 저장하는 것이 가장 좋을까요?

하는 I 키에 대해 동일한 이름 지정 규칙을 사용하는 RedisClientRedisTypedClient을 구성 할 수있을 것입니다하지만 각각의 방법에 저를 (아직)이 작업을 수행 할 수 있습니다 아무것도 문서를 발견하지 않았습니다 이상적 올 어렵다 모두에 의해.

답변

1

ServiceStack 어셈블리를 통해 파기 한 후에 강력한 형식의 클라이언트의 Store() 메서드는 실제로 키 구조를 생성하는 유틸리티 메서드가있는 SetEntry(key,value)이라는 것을 알게되었습니다.

IdUtils.CreateUrn에는 TypeId을 지정하고 키로 사용되는 문자열을 반환하는 몇 가지 오버로드가 있습니다.

내가했던 그렇다면, 그때 어떤 AceOfBase 객체가 생성 될 때 호출 Key로 설정 내 저장소 기본 클래스에서 CreateKey 방법을 쓰기입니다.

나뿐만 아니라 내 응용 프로그램의 클래스의 두 세트를 구현했습니다
//In BaseRepository 
public virtual string CreateKey<T>(T entity) where T : AceOfBase 
{ 
return IdUtils.CreateUrn<AceOfBase>(entity.Id); 
} 

//In MemberRepository 
Member m = new Member(); //inherits from AceOfBase 
m.Key = CreateKey(m); 

,이 내가 EF와 마찬가지로 내가 일반적으로 관계를 사용할 수 있도록하면서 나를 레디 스 '미친 빠른 쿼리 시간을 활용하는 데 도움.

  1. DomainModels - 다음은 그 속성은 전통적으로 구성되어있는 것을 일반 클래스처럼 보인다.

    public class Activity : AceOfBase 
    { 
        public AceOfBase IndirectObject { get; set; } 
        public Participant Predicate { get; set; } 
        public Participant Subject { get; set; } 
        public Verb Verb { get; set; } 
    } 
    
  2. 데이터 모델 -이 그들의 DomainModel 대응과 같은 원시적이고 열거를 포함하지만, 필드 레디 스에 저장되어있는 사용자 정의 유형 인 경우는 (동일한 속성 이름) 문자열로 교체 해당 객체의 키를 나타냅니다.

    public class Activity : AceOfBase 
    { 
        public string IndirectObject { get; set; } 
        public string Predicate { get; set; } 
        public string Subject { get; set; } 
        public Verb Verb { get; set; } 
    } 
    

나는 DomainModel에 같은 이름을 가진 각각의 속성에 DataModel 문자열 속성을 변환하는 번거로운 작업을 사용자 정의 TypeConverter 클래스 세트로 AutoMapper을 구현했습니다. AutoMapper은 개체를 저장하기 직전과 개체가 Redis에서 가져온 후 바로 호출되어 두 모델 유형간에 변환됩니다. 주소 왼쪽

//In Configure() 
Mapper.CreateMap<string,Member>().ConvertUsing<KeyToBaseConverter<Member>>(); 
Mapper.CreateMap<Member, string>().ConvertUsing<BaseToKeyConverter<Member>>(); 

public class KeyToBaseConverter<T> : ITypeConverter<string, T> where T : AceOfBase 
{ 
    public RedisRepository Repository { get; set; } 
    public T Convert(ResolutionContext context) 
    { 
     return Repository.GetByKey<T>(context.SourceValue.ToString()); 
    } 
} 
public class BaseToKeyConverter<T> : ITypeConverter<T, string> where T : AceOfBase 
{ 
    public string Convert(ResolutionContext context) 
    { 
     var f = context.SourceValue as AceOfBase; 
     return f.Key; 
    } 
} 

유일한 요소는 내가 만드는 모든 Lists 또는 Sets 자신의 키에 대해 동일한 서식을받을 것을 보장한다.

이 스키마를 사용하면 강력한 형식의 클라이언트를 문자열 클라이언트와 함께 원활하게 사용할 수 있으므로 엄격한 형식의 클라이언트없이 개체를 가져올 때도 JSON BLOB를 올바른 유형으로 결정하고 안전하게 캐스팅 할 수 있습니다 Key 속성 만 검사하면됩니다.

관련 문제