{"id":3879,"date":"2017-11-22T13:32:52","date_gmt":"2017-11-22T08:02:52","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=3879"},"modified":"2017-11-22T13:44:38","modified_gmt":"2017-11-22T08:14:38","slug":"solid-dependency-inversion-principle","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/","title":{"rendered":"SOLID: Dependency Inversion Principle"},"content":{"rendered":"<h3>Dependency Inversion Principle<\/h3>\n<p><strong>Previous Principle:\u00a0<a href=\"https:\/\/www.innovationm.com\/blog\/solid-interface-segregation-principle\/\" target=\"_blank\" rel=\"noopener\">Interface Segregation Principle<\/a><\/strong><\/p>\n<p><em><code>High-level modules should not depend on low-level modules. Both should depend on abstractions.<\/code><\/em><\/p>\n<p>When designing a system we have low level classes (classes which implement primary operation like: Network access, Disk access, Database access) and high level classes which have business logic. High level classes are dependent on low level classes.<\/p>\n<p>In a bad design the high level classes directly interact with low level classes, what if we have to change the low level class and replace it with some other logic. In this case we have to change the high level classes as well.<\/p>\n<p>In order to avoid such problem we introduce an abstraction layer between high and low level classes. High level classes should not directly depend upon low level classes they will depend on abstract layer and the abstract layer will be according to high level classes. So now the low level classes will depend upon the abstract layer.<\/p>\n<p>So basically what we did is reversed the dependency by using an abstract layer. Now high level classes are not dependent on low level classes but on abstraction and low level classes are based on the abstraction, so both are now depending on abstraction layer.<\/p>\n<p>As abstract layer is created according to the high level classes and low level classes are created according to abstract layer so in a way now low level classes depend upon high level classes. (Dependency inverted).<\/p>\n<p><a href=\"https:\/\/camo.githubusercontent.com\/e152839277f2828c3339be8b248d25db8c74973e\/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f392f39362f446570656e64656e63795f696e76657273696f6e2e706e67\" target=\"_blank\" rel=\"noopener\"><img fetchpriority=\"high\" decoding=\"async\" class=\"CToWUd aligncenter\" src=\"https:\/\/ci4.googleusercontent.com\/proxy\/vHB6qWQWAspy0NYgWwXt3r_THnSsvoSECJ7s9fFG7xURXkI_pIo_n4sDNw1iPwRHut-BaO-WhOmhb3WrIWIfca3iCZVBDfQWoIUqfrOBlpYx_NZGTiuaE3r3NpgDSxH4HXSAUKzbRvijhmKz4KQpouorgZ9iNxC3F5dQ6uQh3ltsCC8HF1gji5TZGQdyO1niiVuS2juMwLiwpyEB2lBSm0oeBhBI9CCSXnUmGWCNYfweCBGUVrkVg9wQChHeFeXbDZ_3OUrvCqvOa4sXciGkUwc5wgnfT0Dg_FCzI8M3pUEDn2fx0V3TlX2hitUXD5RDGs2s-Lgm6-WfEO0=s0-d-e1-ft#https:\/\/camo.githubusercontent.com\/e152839277f2828c3339be8b248d25db8c74973e\/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f392f39362f446570656e64656e63795f696e76657273696f6e2e706e67\" alt=\"alt text\" width=\"716\" height=\"281\" \/><\/a><\/p>\n<p>In\u00a0<code>figure-1<\/code>\u00a0<code>Object A<\/code>\u00a0is directly depend on\u00a0<code>Object B<\/code>\u00a0but after introducing an abstract layer in\u00a0<code>figure-2\u00a0<\/code><code>Interface A<\/code>\u00a0, now the\u00a0<code>Object A<\/code>\u00a0depend on\u00a0<code>Interface A<\/code>\u00a0and\u00a0<code>Object B<\/code>\u00a0follows the rules of\u00a0<code>Interface A<\/code>.<\/p>\n<p>As you can see in\u00a0<code>figure-1<\/code>\u00a0now\u00a0<code>Package 2<\/code>\u00a0depends on\u00a0<code>Package 1<\/code>\u00a0(Dependency inverted).<\/p>\n<p>DIP also removes the coupling between modules.<\/p>\n<p>Now assume we have an\u00a0<code>Notification<\/code>\u00a0class which sends notification to users via Email like following:<\/p>\n<pre class=\"lang:java decode:true \">public class Email {\r\n    public string toAddress;\r\n    public string subject;\r\n    public string content;\r\n    \r\n    public void sendEmail() {\r\n        \/\/Send email\r\n    }\r\n}\r\n\r\n\r\npublic class Notification {\r\n    private Email email;\r\n    \r\n    public Notification(Email email) {\r\n        this.email = email;\r\n    }\r\n\r\n    public void Send() {\r\n        email.SendEmail();\r\n    }\r\n}<\/pre>\n<p>This looks good. Isn&#8217;t it? but what if now in place of\u00a0<code>Email<\/code>\u00a0we want to send notification via\u00a0<code>SMS<\/code>? we have to change the\u00a0<code>Notification<\/code>\u00a0and add\u00a0<code>SMS<\/code>\u00a0support in it.<\/p>\n<p>Now, let&#8217;s see what we can achieve using DIP. See following code:<\/p>\n<pre class=\"lang:java decode:true \">public interface INotification {\r\n    public void sendNotification();\r\n}\r\n\r\npublic class Email implements INotification {\r\n    public string toAddress;\r\n    public string subject;\r\n    public string content;\r\n    \r\n    public void sendNotification() {\r\n        \/\/Send email\r\n    }\r\n}\r\n\r\n\r\npublic class Notification {\r\n    private INotification notification;\r\n    \r\n    public Notification(INotification notification) {\r\n        this.notification = notification;\r\n    }\r\n\r\n    public void Send() {\r\n        notification.sendNotification();\r\n    }\r\n}<\/pre>\n<p>Now if we have to change from\u00a0<code>Email<\/code>\u00a0to\u00a0<code>SMS<\/code>\u00a0we just need to add following class:<\/p>\n<pre class=\"lang:java decode:true \">public class SMS implements INotification {\r\n    public string phoneNumber;\r\n    public string message;\r\n    \r\n    public void sendNotification() {\r\n        \/\/Send sms\r\n    }\r\n}<\/pre>\n<p>And pass the object of\u00a0<code>SMS<\/code>\u00a0to\u00a0<code>Notification<\/code>\u00a0class.<\/p>\n<p>So DIP removes coupling between two modules so that they can be changed independently without affecting each other. It reduces the maintenance cost, bugs and rework. The testing area also minimized because we only need to test the module which is modified.<\/p>\n<p>Using DIP requires more code, more classes and interface and more effort but it makes the design more flexible and less bug prone.<\/p>\n<p>When using DIP the high level class may create the object of low level class using some Creational Design Pattern like: Factory Method, Abstract Factory, Prototype.<\/p>\n<p><span style=\"font-size: large;\"><b>That all about SOLID. Hope you guys enjoyed reading it.<\/b><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dependency Inversion Principle Previous Principle:\u00a0Interface Segregation Principle High-level modules should not depend on low-level modules. Both should depend on abstractions. When designing a system we have low level classes (classes which implement primary operation like: Network access, Disk access, Database access) and high level classes which have business logic. High level classes are dependent on [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3890,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,71,8],"tags":[215,165,13],"class_list":["post-3879","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ios","category-mobile","category-mobile-architecture-and-design","tag-design-pattern","tag-mobile","tag-mobile-design"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SOLID: Dependency Inversion Principle - InnovationM - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SOLID: Dependency Inversion Principle - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"Dependency Inversion Principle Previous Principle:\u00a0Interface Segregation Principle High-level modules should not depend on low-level modules. Both should depend on abstractions. When designing a system we have low level classes (classes which implement primary operation like: Network access, Disk access, Database access) and high level classes which have business logic. High level classes are dependent on [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-22T08:02:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-11-22T08:14:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/DependencyInversionPrinciple.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"750\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"SOLID: Dependency Inversion Principle\",\"datePublished\":\"2017-11-22T08:02:52+00:00\",\"dateModified\":\"2017-11-22T08:14:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/\"},\"wordCount\":450,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/DependencyInversionPrinciple.jpg\",\"keywords\":[\"Design Pattern\",\"Mobile\",\"Mobile Design\"],\"articleSection\":[\"iOS\",\"Mobile\",\"Mobile Architecture and Design\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/\",\"name\":\"SOLID: Dependency Inversion Principle - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/DependencyInversionPrinciple.jpg\",\"datePublished\":\"2017-11-22T08:02:52+00:00\",\"dateModified\":\"2017-11-22T08:14:38+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/DependencyInversionPrinciple.jpg\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/DependencyInversionPrinciple.jpg\",\"width\":750,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-dependency-inversion-principle\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SOLID: Dependency Inversion Principle\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SOLID: Dependency Inversion Principle - InnovationM - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/","og_locale":"en_US","og_type":"article","og_title":"SOLID: Dependency Inversion Principle - InnovationM - Blog","og_description":"Dependency Inversion Principle Previous Principle:\u00a0Interface Segregation Principle High-level modules should not depend on low-level modules. Both should depend on abstractions. When designing a system we have low level classes (classes which implement primary operation like: Network access, Disk access, Database access) and high level classes which have business logic. High level classes are dependent on [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/","og_site_name":"InnovationM - Blog","article_published_time":"2017-11-22T08:02:52+00:00","article_modified_time":"2017-11-22T08:14:38+00:00","og_image":[{"width":750,"height":600,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/DependencyInversionPrinciple.jpg","type":"image\/jpeg"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"SOLID: Dependency Inversion Principle","datePublished":"2017-11-22T08:02:52+00:00","dateModified":"2017-11-22T08:14:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/"},"wordCount":450,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/DependencyInversionPrinciple.jpg","keywords":["Design Pattern","Mobile","Mobile Design"],"articleSection":["iOS","Mobile","Mobile Architecture and Design"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/","url":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/","name":"SOLID: Dependency Inversion Principle - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/DependencyInversionPrinciple.jpg","datePublished":"2017-11-22T08:02:52+00:00","dateModified":"2017-11-22T08:14:38+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/DependencyInversionPrinciple.jpg","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/DependencyInversionPrinciple.jpg","width":750,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/solid-dependency-inversion-principle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SOLID: Dependency Inversion Principle"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/3879","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=3879"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/3879\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/3890"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=3879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=3879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=3879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}