저는 오늘 저녁에 사용자 지정 속성을 사용하여 캐싱 계층을 단순화 할 수 있는지 확인했습니다. 이것은 메서드와 클래스에서 사용자 지정 특성을 만들고 사용하는 올바른 방법입니까?
namespace AttributeCreationTest
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false)]
public class Cache : Attribute
{
public Cache()
{
Length = "01h:30m";
}
public string Length;
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class CacheIdentifier : Attribute
{
}
[Cache]
class Class1
{
[CacheIdentifier]
public int ID { get; set; }
}
class Class2
{
[CacheIdentifier]
public bool ID { get; set; }
}
[Cache(Length = "01h:10m")]
class Class3
{
[CacheIdentifier]
public string ID { get; set; }
}
class Program
{
static void Main(string[] args)
{
var f1 = new Class1 { ID = 2 };
var f2 = new Class2 { ID = false };
var f3 = new Class3 { ID = "someID" };
DoCache(f1);
DoCache(f2);
DoCache(f3);
}
public static void DoCache(object objectToCache)
{
var t = objectToCache.GetType();
var attr = Attribute.GetCustomAttribute(t, typeof(Cache));
if (attr == null) return;
var a = (Cache)attr;
TimeSpan span;
if (TimeSpan.TryParse(a.Length.Replace("m", "").Replace("h", ""), out span))
{
Console.WriteLine("name: {0}, {1}", t.Name, span);
ExtractCacheData(objectToCache);
return;
}
throw new Exception(string.Format("The Length value of {0} for the class {1} is invalid.", a.Length, t.Name));
}
public static void ExtractCacheData(object o)
{
var t = o.GetType();
foreach (var prop in t.GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
if (Attribute.IsDefined(prop, typeof(CacheIdentifier)))
{
Console.WriteLine(" type: {0}, value {1}", prop.PropertyType, prop.GetValue(o));
break;
}
throw new Exception(string.Format("A CacheIdentifier attribute has not been defined for {0}.", t.Name));
}
}
}
}
은 "캐시"속성
이 구체화 될 것입니다,하지만 난 C 번호의 영역을 학습하는 동안 최소한의 그것을 떠 났어요 : I는 다음과 같이 올라와있다. 내 아이디어는 개체를 캐싱하는 데 걸리는 시간을 지정하는 단순화 된 방법을 포함하여보다 쉽게 항목을 캐싱 할 수있게하는 것이 었습니다.이 모양이 좋습니까? 이러한 종류의 패턴을 사용하여 캐시에 항목을 푸는 데 중요한 성능 적중률이 있습니까?
나는 이런 종류의 아이디어를 상세하게 다루는 튜토리얼을 찾을 수 없었으므로 조언을 주시면 감사하겠습니다.
감사합니다. llya! 이전에 PostSharp를 처음 접한 적이 없지만 확실히 확인할 것입니다. 인터페이스 사용을 고려했지만 DDD를 따르는 프로젝트와 다른 프로그래머가 도메인 이외의 특정 정보를 도메인 객체 (캐시 될 클래스)에 추가하는 데 너무 어려울 지 확신하지 못합니다. 그래도 자랄거야! –
@ChrisW 예. 그러나 속성도 종속성이 있으며 도메인과 관련없는 정보이기도합니다. 그래서 Robert Martin은 Dependency Injection의 속성을'Inject'와 같이 비판했습니다. –
그건 사실이야. 내가 게시 한 직후에 나를 때렸지 만, 내 게시물을 편집하기 전에 대답했다. :). 다른 개발자와 어떤 방법을 사용해야하는지에 대해 이야기 할 것입니다. 어떤 방법을 선택 하든지 관계없이 속성 생성에 대한 배경 지식을 갖는 것이 좋습니다. –