开发区域

先进与MATLAB软件开发

依赖性,注射

现在我们已经征服控制反转,我们可以探索一个常见的应用技术,依赖注入。依赖注入利用控制反转,援助的依赖注入框架,构建应用程序通过配置而不是代码。这可能允许将应用程序分发给不同的客户提供不同的需求,而非改变基本的代码来满足这些需求,你可以为他们提供一个配置文件,以及他们所需要的特定实现的代码。然而,核心基础设施之间可以共享许多不同和不同的客户,因为核心基础设施不直接依赖于任何所需的具体实现代码为每个客户。

换句话说,使用我们的拼写检查示例,您可以单独的拼写检查核心引擎和界面的区域特定的字典和独立发布它们。我们显示最后发表,这可以通过使用控制反转技术,但是它需要你的最终用户建立应用程序。如果你给你的软件检查和用户MexicanSpanishDictionary,他们仍然需要创建它通过类似:

检查程序=解释清楚(MexicanSpanishDictionary)
检查程序=解释清楚没有属性。

这似乎很容易,但在现实世界的应用程序中有多个依赖和很可能不是这个容易构建整个应用程序的对象图。然而,使用依赖注入应用程序可以创建和分发不同的行为,在我们的案例中,各区域与一个特定的配置我们想支持。金宝app

如果你是吸引了这种可能性,事实证明你是幸运的,因为那里是一个依赖注入框架在文件交换帮助解决问题。

但首先,你做你的家庭作业了吗?你也许还记得最后发表我建议继续控制反转技术检查但应用技术在发动机以及字典。有人做吗?如果不去读那篇文章,你的手在它,因为我要给你的解决方案(剧透警告)我们可以扩展这个概念。我想展示如何使用依赖注入在至少两层,这样经历,锻炼将是有益的。

好的,这里的关键是,即使解释清楚构造函数是处理的字典和发动机(Jazzy),对我们来说真的只需要引擎。发动机是需要的字典,事实上,可想而知,可能有一些不依赖于相同的引擎字典接口。需要什么字典是奔放的引擎。这是相反的解释清楚类要求字典解释清楚它的构造函数的类可以简单地要求发动机。为此我们需要定义一个接口,用于发动机需要提供:

classdefSpellCheckEngine <处理方法(抽象)checkSpelling(引擎、inputStr);结束结束

然后我们可以操作界面直接解释清楚的代码:

classdef解释清楚属性(GetAccess =私人SetAccess =不可变)引擎;结束方法函数检查程序=解释清楚(引擎)%留住我们的拼写检查引擎检查程序。引擎=engine;结束% %检查方法检查输入字符串函数检查(检查器,inputStr) checker.Engine.checkSpelling (inputStr);结束结束结束

最后,让我们添加特定的奔放的引擎,看看我们可以建立相同的行为最后一个帖子:

classdefJazzySpellCheckEngine < SpellCheckEngine属性(GetAccess =私人SetAccess =不可变)奔放的结束方法函数引擎= JazzySpellCheckEngine(字典)引擎。Jazzy = com.mathworks.spellcheck.SpellCheck ();engine.Jazzy.setDictionary (dictionary.DictionaryFile);engine.Jazzy。verbose = true;结束函数checkSpelling(引擎,inputStr) engine.Jazzy.checkSpelling (inputStr);结束结束结束
s =解释清楚(JazzySpellCheckEngine (AmericanEnglishDictionary));s.check (“你会说MATLAB ?”)
输入:你会说建议:印度手鼓

太棒了!我们是在商业和每个类看起来很干净的一个责任。事实上,他们甚至不负责构建自己的依赖!这是真正的一个应用单一职责原则。的东西其他的有责任将所有这些对象结合在一起,在其构造函数中而不是对象本身。

添加一些迪

好,现在的人负责创建完整的对象连接不应该是你的最终用户。你甚至可以看到两个合作者开始变得冗长。

s =解释清楚(JazzySpellCheckEngine (AmericanEnglishDictionary))
s =解释清楚没有属性。

相反让我们配置。第一步需要为了利用这个依赖注入框架选择允许框架构造的实例对象的派生DI框架的mdepin.Bean接口。注意,我将解释清楚的版本代码使用依赖注入成一个包被称为把依赖注入版本分离从我们的第一次检查。当我们得到的接口我们也需要通过配置传递到构造函数的类层次结构超类。这看起来像下面的为我们的类(放入+ di文件夹,将它放入包):

classdef解释清楚< mdepin.Bean属性引擎;结束方法函数检查程序=解释清楚(配置)检查= checker@mdepin.Bean(配置);结束% %检查方法检查输入字符串函数检查(检查器,inputStr) checker.Engine.checkSpelling (inputStr);结束结束结束classdefSpellCheckEngine < mdepin.Bean方法(抽象)checkSpelling(引擎、inputStr);结束方法函数引擎= SpellCheckEngine(配置)引擎= engine@mdepin.Bean(配置);结束结束结束classdefJazzySpellCheckEngine < di.SpellCheckEngine属性字典结束属性(GetAccess =私人SetAccess =不可变)奔放的结束方法函数引擎= JazzySpellCheckEngine(配置)引擎= engine@di.SpellCheckEngine(配置);引擎。Jazzy = com.mathworks.spellcheck.SpellCheck ();engine.Jazzy.setDictionary (engine.Dictionary.DictionaryFile);engine.Jazzy。verbose = true;结束函数checkSpelling(引擎,inputStr) engine.Jazzy.checkSpelling (inputStr);结束结束结束classdef< matlab.mixin字典。异构& mdepin.Bean属性(抽象)DictionaryFile结束方法函数字典=字典(配置)字典= dictionary@mdepin.Bean(配置);结束结束结束classdefAmericanEnglishDictionary < di.Dictionary属性DictionaryFile =“en_USx.dic”;结束方法函数字典= AmericanEnglishDictionary(配置)字典= dictionary@di.Dictionary(配置);结束结束结束

唯一的差别是来自超类列表mdepin.Bean和构造函数的变化都接受的配置和转发配置的超类。

然而,现在我们可以让我们的配置创建对象图!首先我们创建一个结构。注意,这个配置被指定为一个结构,感觉有点像代码而不是配置,但那是因为框架支持这种情况下作为一个结构体的盒子。金宝app这个可以很容易被扩展来创建一个上下文类从一个更经典的声明的形式像JSON或XML。你只需要创建自己的mdepin的子类。上下文为了生产这些形式的配置。对我们来说,这些声明的结构版本都可以做得很好:

%定义解释清楚类,并给它一个标签“拼写检查”ctx.spellchecker。类=“di.spellcheck”;%分配一个标签在配置定义所需的发动机ctx.spellchecker。引擎=“spell_check_engine”;%将JazzySpellCheckEngine链接到我们的引擎标签ctx.spell_check_engine。类=“di.JazzySpellCheckEngine”;%分配一个标签在配置定义所需的字典ctx.spell_check_engine。字典=“american_english_dictionary”;%将AmericanEnglishDictionary链接到我们的词典标签ctx.american_english_dictionary。类=“di.AmericanEnglishDictionary”;

基于这种结构的配置框架可以为我们构建完整的对象图。

s = mdepin.createApplication (ctx,“拼写检查”)
s =属性解释清楚:引擎:[1 x1 di.JazzySpellCheckEngine]

它工作吗?如果是应该在这里找到一个错字,因为我们使用英语词典。

s.check (“你会说MATLAB ?”)
输入:你会说建议:印度手鼓

¡Absolutamente !

我们拥有它,我们已经分离出构造逻辑,和使用依赖注入框架,这样我们的建筑逻辑可以配置而不是代码。这允许灵活地分配给我们的MATLAB软件包,因为不同的客户可以使用不同的配置。

应该使用依赖注入的一切吗?不一定。它有一些明确的好处,但它需要一个额外的依赖DI框架,它可以影响软件的编写方式。例如,在这个例子中我们需要修改类来自域模型(外面的东西),我们的构造函数签名使用的框架的影响。使用手工构造函数注入无疑是一个有效的选择,它只是要求其他合作者在您的软件(工厂)有责任构建对象图。如果你不介意框架依赖和你想将责任委托给一个工具然后DI框架可以很好地工作。

另一个相关的模式是一个服务定位器,也有自己的优点和缺点,但支持类似的用例是用一种更加灵活多变的决议所需的依赖项。金宝app许多观点依赖注入模式竞争服务定位器。我倾向于认为它们是互补的。我想介绍一篇文章在MATLAB的服务定位器在未来,但现在让我们休息的话题。这是暗语“我们有一些很酷的帖子在管道在一些不同的主题。”记住,在3月初R2016a出来!提示露齿而笑

同时你曾经想要一个在MATLAB DI框架吗?这个文件交换的例子是相对较新的,所以一定试一试。你能看见一个依赖注入框架帮助您的生产代码?




发表与MATLAB®R2015b

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。