GreanTech / AtomEventStore

A server-less .NET Event Store based on the Atom syndication format
MIT License
117 stars 14 forks source link

TypeResolutionTable #91

Closed ploeh closed 10 years ago

ploeh commented 10 years ago

Whenever I use DataContractContentSerializer or XmlContentSerializer, I find myself implementing the required ITypeResolver in more or less the same way:

public class UserTypeResolver : ITypeResolver
{
    public Type Resolve(string localName, string xmlNamespace)
    {
        switch (xmlNamespace)
        {
            case "urn:grean:samples:user-sign-up":
                switch (localName)
                {
                    case "user-created":
                        return typeof(UserCreated);
                    case "email-verified":
                        return typeof(EmailVerified);
                    case "email-changed":
                        return typeof(EmailChanged);
                    default:
                        throw new ArgumentException(
                            "Unknown local name.",
                            "localName");
                }
            default:
                throw new ArgumentException(
                    "Unknown XML namespace.",
                    "xmlNamespace");
        }
    }
}

It would be nice with a reusable class where you can simply supply the values; something like this would be nice:

var resolver = new TypeResolutionTable(
    new TypeResolutionEntry("urn:grean:samples:user-sign-up", "user-created", typeof(UserCreated)),
    new TypeResolutionEntry("urn:grean:samples:user-sign-up", "email-verified", typeof(EmailVerified)),
    new TypeResolutionEntry("urn:grean:samples:user-sign-up", "email-changed", typeof(EmailChanged)));

TypeResolutionTable should obviously implement ITypeResolver.

moodmosaic commented 10 years ago

Would it make sense to replace all UserTypeResolver occurrences in samples with TypeResolutionTable?

ploeh commented 10 years ago

I have already done that :)

moodmosaic commented 10 years ago

Oh! That was too fast for me :)