changtianshuiyue的专栏

最近和小伙伴们在做一个前台小框架, 已经有些人用起来了。 但是之前框架没有引入 Ioc, 所以用户实现我们框架开放出去的接口后,,我们只能通过反射来获取用户的实现类。这样一个问题就是我们虽然定义了接口, 但其实我们依然依赖于用户的实现,同时框架启动异常的慢。 所以我们打算使用开源 Ioc 框架来把完成依赖注入的动作。 我们就完全关心我们自己的接口, 然后用户可以自己把实现类注入到框架中来,这样不仅移除了依赖,同是也砍掉了反射,可以加快加载速度。

因为开放的接口中定义了泛型接口,所以选中支持泛型接口的 Unity 来完成 Ioc 功能。 下面一步步实现一个简单的 Unity 泛型接口实例。

首先定义三个项目:

UnityPrimer 框架代码UnityPrimerClient 框架用户代码UnityPrimerInterfaces 框架接口

项目结构如图:

框架接口包含:

实体接口namespace UnityPrimerInterfaces.Interfaces{public interface IModel{string Name { get; set; }}}泛型接口namespace UnityPrimerInterfaces.Interfaces{public interface IEnricher<T> where T:IModel{T StringToModel(string message);string ModelToString(T model);}}

框架用户实现代码:实现框架定义的接口,并且把实现实例注入到容器中。

接口实现 public class Model :IModel{private string name;public string Name{get{return name;}set{name = value;}}}public class Enricher<T> : IEnricher<T> where T:IModel{public T StringToModel(string message){var model =new Model() { Name = message };return (T)((IModel)model);}public string ModelToString(T model){return model.Name;}}注册器namespace UnityPrimerClient{public class Register{public static IUnityContainer Container;public static void Regist(){Container = new UnityContainer();Container.RegisterType(typeof(IEnricher<>), typeof(Enricher<>), "Sample");//Container.RegisterType(typeof(IEnricher<IModel>), typeof(Enricher<Model>), "Sample");//Container.RegisterInstance<IEnricher<IModel>>(new Enricher<Model>());}}}

框架代码:框架从容器中获取用户实现的对象,并进行操作。

namespace UnityPrimer{class Program{static void Main(string[] args){Register.Regist();var enricher = Register.Container.Resolve<IEnricher<IModel>>("Sample");IModel model = enricher.StringToModel("SampleModel");Console.WriteLine(enricher.ModelToString(model));Console.ReadLine();}}}

对于 Unity 来说,最容易出错的部分,就是 register 和 resolve 的时候。同是对于泛型接口,泛型约束会导致resolve失败。

人生如果错了方向,停止就是进步”。

changtianshuiyue的专栏

相关文章:

你感兴趣的文章:

标签云: