Setter注入(Setter Injection)
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Demo.BLL { #region 调用 public class Demo { public void Test() { ITimeProvider timeProvider = (new Assembler()).Create<ITimeProvider>(); Client _client = new Client(); _client.timeProvider = timeProvider; Console.WriteLine(_client.GetYear()); Console.WriteLine(_client.GetDatetime()); //setterInjection IServiceClass serviceA = new ServiceClassA(); IServiceClass serviceB = new ServiceClassB(); ClientClass client = new ClientClass(); client.Set_ServiceImpl(serviceA); client.ShowInfo(); client.Set_ServiceImpl(serviceB); client.ShowInfo(); Console.ReadLine(); } } #endregion #region 属性接口 public interface ITimeProvider { DateTime CurrentDate { get; } string CurrentYear { get; } } public class TimeProvider : ITimeProvider { public DateTime CurrentDate { get { return DateTime.Now; } } public string CurrentYear { get { return DateTime.Now.Year.ToString(); } } } public class Assembler { private static Dictionary<Type, Type> dictionary = new Dictionary<Type, Type>(); public Assembler() { dictionary.Add(typeof(ITimeProvider), typeof(TimeProvider)); } public object Create(Type type) { if (type == null || !dictionary.ContainsKey(type)) throw new NullReferenceException(); Type targetType = dictionary[type]; return Activator.CreateInstance(targetType); } public T Create<T>() { return (T)Create(typeof(T)); } } public class Client { public ITimeProvider timeProvider { get; set; } public string GetYear() { return timeProvider.CurrentYear.ToString(); } public string GetDatetime() { return timeProvider.CurrentDate.ToString(); } } #endregion #region 方法接口 internal interface IServiceClass { string ServiceInfo(); } internal class ServiceClassA : IServiceClass { public string ServiceInfo() { return "我是ServceClassA"; } } internal class ServiceClassB : IServiceClass { public string ServiceInfo() { return "我是ServceClassB"; } } internal class ClientClass { private IServiceClass _serviceImpl; public void Set_ServiceImpl(IServiceClass serviceImpl) { this._serviceImpl = serviceImpl; } public void ShowInfo() { Console.WriteLine(_serviceImpl.ServiceInfo()); } } #endregion }