jamir-araujo / GraphCache.Old

A Cache for complex objects
1 stars 0 forks source link

Mudar implementação de convenção #1

Closed jamir-araujo closed 8 years ago

jamir-araujo commented 8 years ago

Uma convenção deve herdar da classe abstrata Convetion ao invés de implementar a interface IConvetion como é feito hoje. Dessa formar é possível fornecer métodos mais otimizados que usem a classe PropertyAssessorFactory que cria delegates para um acesso mais rápido que Refleciton pura.

jamir-araujo commented 8 years ago

Mudanças na superfície da API.

Implementações de convenção mudaram.

Agora, ao invés de implementar a interface IConvention, um convenção passara a herdar da classe abstrata Convention.

Interface IConvention:

public interface IConvention
{
    Func<object, string> CreateKeyExtractor(Type type);
    bool FitInConvention(Type type);
}

classe abstrata Convention:

public abstract class Convention
{
    public abstract Func<object, string> CreateKeyExtractor(Type type);
    public abstract bool FitInConvention(Type type);
    protected Func<object, object> GetPropertyGetter(Type type, string propertyName);
    protected bool HasProperty(Type type, string propertyName);
}

Onde uma implementação de convenção customizada ficaria assim:

public class MyConvention : IConvention
{
    public Func<object, string> CreateKeyExtractor(Type type)
    {
        var property = type.GetProperty("Id");
        return obj => property.GetValue(obj).ToString();
    }

    public bool FitInConvention(Type type)
    {
        return type.GetProperty("Id") != null;
    }
}

Agora, fica assim:

public class MyConvention : Convention
{
    public override Func<object, string> CreateKeyExtractor(Type type)
    {
        var getter = GetPropertyGetter(type, "Id");
        return obj => getter(obj).ToString();
    }

    public override bool FitInConvention(Type type)
    {
        return HasProperty(type, "Id");
    }
}

Construção da classe CacheConfiguration mudou.

O método construtor da classe CacheConfiguration que recebia uma implementação de convenção era assim:

public class CacheConfiguration
{
    public CacheConfiguration(ObjectCache objectCache, IConvention convention) { ... }
}

Ficou assim:

public class CacheConfiguration
{
    public CacheConfiguration(ObjectCache objectCache, Convention convention) { ... }
}