StrangeIOC MVCS框架介绍及进阶

这一篇教程将带大家熟悉 StrangeIOC框架 并且讲解一些C#的实用的高级技巧 如 "依赖注入(DI)之属性注入" ,"控制反转(IOC)"。老规矩先问几个问题

1.框架在项目中实现"看起来"过于复杂?

答: 原本直接实现的东西现在要“兜一圈”当然这里的兜一圈是打引号的,其实是循规蹈矩的,该往哪里写代码早就在事先约定好了

2.使用了此框架后代码理解起来很费力?

答:这一条纯属是没有框架概念的人会有的,如果你稍稍注意代码的规律,你会发现 固定的代码只出现在固定的地方

3.断点不知往哪里打 ,说的更直白点就是小白完全追踪不到别人写的代码

答:代码追踪其实应该是代码风格的问题,这个很大程度上是人为的把Signal或IEvent写的满天飞 找不到注册的源头

现在,是时候开始学习StrangeIOC,我们的目标是 完成一个 " 自动化 简洁 高效 " 的框架 。如果你感兴趣可以过来一起聊聊 StrangeIOC  137728654 。

假定现在你已经对本框架有了初步了解,如果并未有了解也无妨可以看完本篇之后回过头再看官方的教程,比较走运的是教程我已经翻译好了,这是目录 http://www.cnblogs.com/Keyle/p/4345044.html

我们先看看框架的概念图把,从这张概念图中会引申出我们要讨论的几个话题


话题一  模块之间划分

模块的划分看似是个技术活,划分完成之后却又变成体力活。为什么这样说呢?原因很简单当我们在给项目分模块的时候其实也是在划分代码的服务边界,要求我们理清楚代码的调用关系,让其符合MVC的概念。当我们划分完成之后每次新建一个类的时候都需要新建一个对应的Mediator有时候还要新建一个Command与一个Model,每次新建一个View可能需要重复此步骤,当然现在我正在开发的工具就是为了省去这个中间步骤 一键生成代码。听起来是很爽的样子 。模块划分应该是项目开启的第一步,这个划分应该把握住一点 分清模块的职责不要混在一起,你不能说我们的一个模块是负责XX与XX和XX,你应该说  我们的一个模块只负责XX

话题二 View驱动方式的抉择

大的模块划分要求我们符合MVC概念,但是在模块内我们还是要自己维护内部的调用关系,关于View的驱动方式,我最先想到的是通过Cammand驱动 或是 通过Model驱动,先说Command驱动方式,我们可以想象成把传统的三层架构的Logic层放在Command,数据来自Command对Model的查询,这是变成了 Command 决策View的行为并提供数据,而View与Model没有交互,再聊第二种数据驱动,也就是Model驱动界面,给View建一个对应的Model保存View的状态,每次刷新都只需要View对外提供一个Refresh接口便可以刷新View的信息,实际开发过程中这个抉择似乎没有绝对的,有时候哪种实现方式方便用哪一种,而我们新建的实体Model也将不纳入全局的Model,而作为模块级别的ViewModel 。(所谓全局的Model一般指策划配置的数据或是数据源)

话题三  模块之间通讯

StrangeIOC提供的消息总线有两种 一种是IEvent传递,还有一种是通过Signal传递,我们写代码的时候只需要选择一种消息总线的实现方式即可,使用IEvent的好处是 自己可以继承此接口自己实现自定义的消息体,譬如自定义一个传递消息的类可以包括任意多的自己需要传递的类,缺陷是 每次接收到消息的时候都是以IEvent接口的形式 势必需要 as 一次或者直接强转一次,首先这是一种类型不安全的做法,同时也会造成不必要的性能损耗。Signal是StrangeIOC框架成熟后提供的,Signal的好处是强类型 ,类型安全 也不需要强转,你只需要在接收的地方Inject属性即可,如果硬要说使用Signal的不好的话,我想应该是如果你在调用的地方注入了一个Signal的强类型列表中不存在的类型,会报错, 错误信息是 InjectionException: Attempt to Instantiate a null binding. 试图实例化一个空的绑定。意为在绑定列表中未找到与此属性对应的类型注入,也就是没有Bind到IOC容器内却被调用导致为空。

几个概念

想要熟悉StrangeIOC那么话题三中我们提到几个概念 注入 绑定 IOC容器 是必须要懂的,那下面我们开始讲讲上面提到的几个概念

1. IOC容器 IOC也被成为控制反转,在StrangeIOC与许许多多框架通常用这种技巧实现一个容器,我们将代码内的依赖关系交给第三方(IOC容器)管理,需要什么类型告诉工厂你要的类型,他会生产给你一个实例,简而言之我们可以看作是一个用来new类型的工厂(参见设计模式之简单工厂)

2.Bind 我们可以理解为往这个IOC工厂内添加接口与类型的映射

3.注入 也叫依赖注入(DI),这个注入的过程就是从IOC容器内取值的过程,注入的方式有很多 属性注入,接口注入,方法注入,而下文我们着重看看如何实现一个属性注入,StrangeIOC就是使用属性注入,这也是很多初学者疑惑的地方,为什么我写了一个[Inject]就能获取到实例。

实现属性注入

以下代码用以模拟注入标签,当然实际框架中也是这样做的,现在把你向注入的类型都打上标签把~

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]

    sealed class InjectAttribute : Attribute

    {

        readonly string positionalString;

        public InjectAttribute(string injectType)

        {

            positionalString = injectType;

        }

        public InjectAttribute()

        {

        }

    }

以下代码用以实现一个简单注入工厂 此类是一个单例(通过属性器实现),来模拟注入框架,BindCache 为注入的类型列表,这里我用泛型Bind来添加BindCache

public class InjectorFactory

    {

        private static InjectorFactory instance;

        public static InjectorFactory Instance

        {

            get { return instance ?? (instance = new InjectorFactory()); }

        }

        private InjectorFactory() { BindCache = new Dictionary<Type, Type>(); }

        public Dictionary<Type, Type> BindCache { get; set; }

        public void Bind<T, V>()

        {

            if (!BindCache.ContainsKey(typeof(T)))

            {

                BindCache.Add(typeof(T), typeof(V));

            }

            else

            {

                BindCache[typeof(T)] = typeof(V);

            }

        }

        public T CreateInstance<T>() where T : new()

        {

            var a = new T();

            //注入此类内部属性

            KeyValuePair<Type, PropertyInfo>[] pairs = new KeyValuePair<Type, PropertyInfo>[0];

            object[] names = new object[0];

            MemberInfo[] privateMembers = a.GetType().FindMembers(MemberTypes.Property,

                                                    BindingFlags.FlattenHierarchy |

                                                    BindingFlags.SetProperty |

                                                    BindingFlags.Public |

                                                    BindingFlags.NonPublic |

                                                    BindingFlags.Instance,

                                                    null, null);

            foreach (MemberInfo member in privateMembers)

            {

                object[] injections = member.GetCustomAttributes(typeof(InjectAttribute), true);

                if (injections.Length > 0)

                {

                    PropertyInfo point = member as PropertyInfo;

                    Type pointType = point.PropertyType;

                    point.SetValue(a, Activator.CreateInstance(BindCache[pointType]));

                }

            }

            return a;

        }

    }

既然要注入怎么少的了一个基类或一个接口呢

public interface IMyClass

    {

        string GetName();

    }

我们用以下两个类去实现这个接口

public class MyClass1 : IMyClass

    {

        public string GetName()

        {

            return "Keyle Is Inject MyClass1 ...";

        }

    }

    public class MyClass2 : IMyClass

    {

        public string GetName()

        {

            return "Keyle Is Inject MyClass2 ...";

        }

    }

编写一个测试类,我们注入它

public class Test
    {
        [Inject]
        public IMyClass cls { get; set; }
    }

测试以下我们实现的注入工厂

static void Main(string[] args)
{
       //注入类类型
        InjectorFactory.Instance.Bind<IMyClass, MyClass2>();
       //进入框架生命周期
        var test = InjectorFactory.Instance.CreateInstance<Test>();
      //调用此类的方法GetName
       Console.WriteLine(test.cls.GetName());
       Console.ReadKey();
}

测试结果,当然如果你把上面的Bind改成Bind<IMyClass, MyClass1>则下面也会变成 Keyle Is Inject MyClass1

结束语

以前我向好几个朋友推荐过此框架,由于各种各样的原因用到项目中的人少之又少,希望这篇教程能帮助你更好的学习StrangeIOC这个框架,我觉得这个框架真心不错 ,即使对于想学架构而不用在项目中的同学来说都是宝贵的学习资源。祝好运~

时间: 2024-10-05 14:14:58

StrangeIOC MVCS框架介绍及进阶的相关文章

Foundation框架介绍

1.Foundation框架介绍 什么是框架? 众多功能\API的集合 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易,在OS X下的Mac操作系统中大约有80个框架,为所有程序开发奠定基础的框架称为Foundation 框架 Foundation框架的作用 Foundation框架是Mac\iOS中其他框架的基础 Foundation框架包含了很多开发中常用的数据类型: 结构体 枚举 类 如何使用Foundation框架 Foundation框架中大约有

如何在程序开发项目中选择合适的 JavaScript 框架,节省时间和成本的9款极佳的JavaScript框架介绍

从技术上来看,iOS,Android 和 Windows Phone 上的移动应用是使用不同的程序语言开发的,iOS 应用使用 Objective-C,Android 应用使用 Java,而 Windows Phone 应用使用 .NET. .随着 JavaScript,CSS 和 HTML 知识技能的提升,相信你也可以构建一个超赞的移动应用.在这篇博客里,我们将会介绍一些极好的 JavaScript 移动应用程序开发框架. 说到网络开发,就不得不说 JavaScript,这是一款很有前途的程序

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 2015-04-05 15:25 2482人阅读 评论(1) 收藏 举报开源框架 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.      下载:https://github.com/mwaterfall/MWPhotoBrowser目前比较活跃的社区仍旧是Github,

ERPSYSTEM开发教程01 框架介绍

从今天开始我将给大家带来一套有关Delphi开发的教程 主要开发ERP软件 我个人觉得,ERP软件的开发,技术层面的不是最大问题, 而是对客户需求的认知程度以及如何管理复杂多样的需求. 因此一个开发框架显得非常重要! 这里我推荐一套来自网络的开源框架 Tangram Plugin Framework 框架特点 1.采用模块化插件开发,支持DLL和BPL两种模块方式 2.自动或手动动态加载模块 3.模块与模块或主程序之间均使用统一的接口方式进行访问 源代码下载地址  http://code.goo

JAVA SSH 框架介绍

SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架. Struts Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注.Struts把Servlet.JSP.自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套M

第三百零三节,Django框架介绍

Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布. 这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. Django框架,流程图

java集合框架小结(进阶版)之HashMap篇

基本概念: Hash(哈希):hash一般也译作“散列”.事实上,就是一个函数,用于直接定址.将数据元素的关键字key作为变量,通过哈希函数,计算生成该元素的存储地址. 冲突:函数是可以多对一的.即:多个自变量可以映射到同一函数值.一般而言,不同的key的hash值是不同的.在往hash表中映射的时候,不同的hash值可能映射到同一存储地址,这种情况被称为冲突. 解决冲突的方法: 1. 链表法:将冲突的各个元素用一个一维数组来维护.(java源码实现) 2. 开发寻址法:具体的有线性探测法.二次

java集合框架小结(进阶版)之HashSet篇

建议先看下:java集合框架小结(进阶版)之HashMap篇 基本概念: hashSet: 根据java集合框架小结(初级版)图示,HashSet是AbstractSet的一个子类,是基于Hash算法的Set接口的实现,顾名思义.允许添加null. --------------------------------------↑ 以上都是扯淡 ↑,↓ HashSet完全是在挂羊头卖狗肉 ↓------------------------------------------- 何谓挂羊头卖狗肉?大家

框架介绍

开发框架:由大量的类.方法与函数按一定的逻辑组织起来的一个集合 必备知识: OOP(Object Oriented Programming) 面向对象编程 MVC(Model View Controller)设计模式 Model-->操作数据库 View-->显示 Controller-->控制器,处理视图(中间层,操作视图与模型) Smarty模板引擎使用 一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计.协作构件之间的依赖关系.责任分配和控制流程,表现为一组抽象