Eventos

[MVVM] InstanceResolver

En este post compartiré como implementar de manera muy básica un InstanceResolver para clases con un constructor sin sobrecargas.

InstanceResolver.cs


public class InstanceResolver
    {
        public static readonly InstanceResolver Default = new InstanceResolver();

        private InstanceResolver() { }

        private readonly IDictionary<Type, Type> TypeMap = new Dictionary<Type, Type>();
        private readonly IDictionary<Type, object> Instances = new Dictionary<Type, object>();

        public T Resolve<T>()
        {
            return (T)Resolve(typeof(T));
        }

        public void Register<TFrom>()
        {
            TypeMap.Add(typeof(TFrom), typeof(TFrom));
        }

        public void Register<TFrom, TTo>()
        {
            TypeMap.Add(typeof(TFrom), typeof(TTo));
        }

        private object Resolve(Type type)
        {
            try
            {
                object resolvedType = null;

                if (Instances.ContainsKey(type))
                {
                    resolvedType = Instances[type];
                }
                else
                {
                    resolvedType = Activator.CreateInstance(TypeMap[type]);
                    Instances.Add(type, resolvedType);
                }

                return resolvedType;
            }
            catch (Exception)
            {
                throw new Exception(string.Format("Could not resolve type {0}", type.FullName));
            }
        }
    }


¿Como usar?


    public class ViewModelLocator
    {
        public ViewModelLocator()
        {
            InstanceResolver.Default.Register<LoginVM>();
            InstanceResolver.Default.Register<UsuarioVM>();
        }

        public LoginVM LoginVM 
        {
            get
            {
                return InstanceResolver.Default.Resolve<LoginVM>();
            }
        }

        public UsuarioVM UsuarioVM
        {
            get
            {
                return InstanceResolver.Default.Resolve<UsuarioVM>();
            }
        }
    }

No hay comentarios.:

Publicar un comentario

Epicalsoft — Superheroic Software Development Blog Designed by Templateism.com Copyright © 2014

Con tecnología de Blogger.