汎用パラメータによるインタフェース注入


 public interface ITimeProvider

    {

        DateTime CurrentDate { get; }

    }

    public class TimeProvider : ITimeProvider

    {

        public DateTime CurrentDate { get { return DateTime.Now; } }

    }

   

    // Assembler

    public class Assembler

    {

        static Dictionary<Type, Type> dictionary = new Dictionary<Type, Type>();

        static Assembler()

        {

            dictionary.Add(typeof(ITimeProvider), typeof(TimeProvider));

        }



        public object Creat(Type type)

        {

            if ((type == null) || !dictionary.ContainsKey(type))

                throw new NullReferenceException();

            return Activator.CreateInstance(dictionary[type]);

        }



        // 

        public T Creat<T>()

        {

            return (T)Creat(typeof(T));

        }

    }



    //public class Client : IobjectWithTimeProvider

    //{

    //    public ITimeProvider TimeProvider { get; set; }

    //}

    //  Client 

    class Client<T> : ITimeProvider where T : ITimeProvider

    {

        public T Provider { get; set; }

        public DateTime CurrentDate

        {

            get { return Provider.CurrentDate; }

        }

    }

 
 
テスト
 
 /// <summary>

    ///  ClientTest  , 

    ///  ClientTest  

    ///</summary>

    [TestClass()]

    public class ClientTest

    {





      



        [TestMethod()]

        public void CurrentDateTest()

        {

            var client = new Client<ITimeProvider>()

            {

                Provider = (new Assembler()).Creat<ITimeProvider>()

            };



        }

    }