Dependency Injection Dependency Injection https support microsoft comzhcnlifecycleselectindex

  • Slides: 87
Download presentation
Dependency Injection 那些事儿

Dependency Injection 那些事儿

Dependency Injection 那些事儿

Dependency Injection 那些事儿

生命周期策略:https: //support. microsoft. com/zh-cn/lifecycle/selectindex

生命周期策略:https: //support. microsoft. com/zh-cn/lifecycle/selectindex

分析数据源自 https: //wappalyzer. com/

分析数据源自 https: //wappalyzer. com/

分析数据源自 https: //wappalyzer. com/

分析数据源自 https: //wappalyzer. com/

了解它的本质 词云生成自:https: //www. qt 86. com/tools/ciyun. php

了解它的本质 词云生成自:https: //www. qt 86. com/tools/ciyun. php

DI 的时间表(. NET ) · 1983年Hollywood principle The Mesa Programming Environment · 1988年 6/7月份的时候好莱坞原则的另一种说法Inversion

DI 的时间表(. NET ) · 1983年Hollywood principle The Mesa Programming Environment · 1988年 6/7月份的时候好莱坞原则的另一种说法Inversion of Control首次出现在文章《Designing Reusable Classes》中 C#发布 · 2000年 6月C#. NET Framework 1. 0发布 · 2002年 2月. NET Framework · 2004年 1月Martin Fowler Inversion of Control Containers and the Dependency Injection pattern Dependency Injection · 2004年 6月 Structure. Map 0. 80 2. 6. 3 · 2004年 8月 Spring. NET 0. 6 · 2006年 1月Windsor Release-Jan-06 1. 3. 0 4. 0. 0 -alpha 1 · 2007年 11月Autofac 1. 0 4. 9. 0 -beta 1 · 2008年 5月Unity Container 1. 1 · 2010年 2月Ninject 1. 5 5. 0. 0 -beta 001 2. 1 3. 3. 4 . NET Core RC 1发布,并在这个版本的中发布了Microsoft. Extensions. Dependency. Injection. Abstractions 和其默认实 · 2015年 11月. NET Core Microsoft. Extensions. Dependency. Injection 现Microsoft. Extensions. Dependency. Injection . NET Core 2. 2. 0发布的,同月发布3. 0. 0 Preview 1 · 2018年 12月. NET Core

读懂它的思路 The major cause of the software crisis is that the machines have become

读懂它的思路 The major cause of the software crisis is that the machines have become several orders of magnitude more powerful! To put it quite bluntly: as long as there were no machines, programming was no problem at all; when we had a few weak computers, programming became a mild problem, and now we have gigantic computers, programming has become an equally gigantic problem. 如果没电脑,编程就根本不是问题 如果电脑差,编程就是个小问题 如果电脑非常好,编程就是个大问题 软件危机就是因为现在机器变好了,编程变麻烦了带来的问题 参考:https: //en. wikipedia. org/wiki/Software_crisis

读懂它的思路 参考:https: //en. wikipedia. org/wiki/Design_Patterns

读懂它的思路 参考:https: //en. wikipedia. org/wiki/Design_Patterns

读懂它的思路 我们需要什么样的设计 • https: //en. wikipedia. org/wiki/Maintainability • https: //en. wikipedia. org/wiki/Software_testability • https:

读懂它的思路 我们需要什么样的设计 • https: //en. wikipedia. org/wiki/Maintainability • https: //en. wikipedia. org/wiki/Software_testability • https: //en. wikipedia. org/wiki/Extensibility • https: //en. wikipedia. org/wiki/Late_binding • https: //en. wikipedia. org/wiki/Integrated_development_environment • • https: //en. wikipedia. org/wiki/Aspect-oriented_programming https: //en. wikipedia. org/wiki/Loose_coupling

读懂它的思路 • Single responsibility principle • Open/Closed Principle • Liskov Substitution Principle • Interface

读懂它的思路 • Single responsibility principle • Open/Closed Principle • Liskov Substitution Principle • Interface Segregation Principle • Dependency Inversion Principle

读懂它的思路 Message. Store Message. Serivce Message. Controller

读懂它的思路 Message. Store Message. Serivce Message. Controller

读懂它的思路 public interface IStore<E> { E[] Query. All(); bool Save(E obj); } public class

读懂它的思路 public interface IStore<E> { E[] Query. All(); bool Save(E obj); } public class Message. Store : IStore<Message> { //从mssql中查询存储数据 public Message[] Query. All() => new Message[0]; public bool Save(Message obj) => true; }

读懂它的思路 public interface IMessage. Serivce { Message[] Get. All. Messages(); bool Add. New. Message(Message

读懂它的思路 public interface IMessage. Serivce { Message[] Get. All. Messages(); bool Add. New. Message(Message message); } public class Message. Serivce : IMessage. Serivce { private readonly IStore<Message> message. Store = new Message. Store(); public Message[] Get. All. Messages() => message. Store. Query. All(); public bool Add. New. Message(Message message) => message != null && message. Store. Save(message); }

读懂它的思路 public class Message. Contoller : Controller { private readonly IMessage. Serivce message. Serivce

读懂它的思路 public class Message. Contoller : Controller { private readonly IMessage. Serivce message. Serivce = new Message. Serivce(); [Http. Get] public View. Result Index() => View(message. Serivce. Get. All. Messages()); [Http. Post] public Json. Result Add. New. Message([From. Body] Message message) => Json(message. Serivce. Add. New. Message(message)); }

读懂它的思路 public class Sql. Server. Message. Store : IStore<Message> { //从mssql中查询存储数据 public Message[] Query.

读懂它的思路 public class Sql. Server. Message. Store : IStore<Message> { //从mssql中查询存储数据 public Message[] Query. All() => new Message[0]; public bool Save(Message obj) => true; } public class My. SQLMessage. Store : IStore<Message> { //从mysql中查询存储数据 public Message[] Query. All() => new Message[0]; public bool Save(Message obj) => true; }

读懂它的思路 public class Message. Serivce : IMessage. Serivce { protected IStore<Message> Message. Store =>

读懂它的思路 public class Message. Serivce : IMessage. Serivce { protected IStore<Message> Message. Store => Create. Message. Store(); protected virtual IStore<Message> Create. Message. Store() => new Sql. Server. Message. Store(); public Message[] Get. All. Messages() => Message. Store. Query. All(); public bool Add. New. Message(Message message) => message != null && Message. Store. Save(message); } public class My. SQLMessage. Serivce : Message. Serivce, IMessage. Serivce { protected override IStore<Message> Create. Message. Store() => new My. SQLMessage. Store(); }

读懂它的思路 public class Message. Store. Factory { public static readonly Message. Store. Factory Instance

读懂它的思路 public class Message. Store. Factory { public static readonly Message. Store. Factory Instance = new Message. Store. Factory(); public IStore<Message> Create. Message. Store() { var db. Type = App. Configuration. Get. DBType(); if (string. Equals(db. Type, "mysql", String. Comparison. Ordinal. Ignore. Case)) return new My. SQLMessage. Store(); if (string. Equals(db. Type, "mssql", String. Comparison. Ordinal. Ignore. Case)) return new Sql. Server. Message. Store(); throw new Configuration. Exception(); } }

读懂它的思路 public class Message. Serivce : IMessage. Serivce { private readonly IStore<Message> message. Store

读懂它的思路 public class Message. Serivce : IMessage. Serivce { private readonly IStore<Message> message. Store = Message. Store. Factory. Instance. Create. Message. Store(); public Message[] Get. All. Messages() => message. Store. Query. All(); public bool Add. New. Message(Message message) => message != null && message. Store. Save(message); }

读懂它的思路 public class Sql. Server. Photo. Store : IStore<Photo> { //从mssql中查询存储数据 public Photo[] Query.

读懂它的思路 public class Sql. Server. Photo. Store : IStore<Photo> { //从mssql中查询存储数据 public Photo[] Query. All() => new Photo[0]; public bool Save(Photo obj) => true; } public class My. SQLPhoto. Store : IStore<Photo> { //从mysql中查询存储数据 public Photo[] Query. All() => new Photo[0]; public bool Save(Photo obj) => true; }

读懂它的思路 public interface IStore. Factory { IStore<Message> Create. Message. Store(); IStore<Photo> Create. Photo. Store();

读懂它的思路 public interface IStore. Factory { IStore<Message> Create. Message. Store(); IStore<Photo> Create. Photo. Store(); }

读懂它的思路 public class Sql. Server. Store. Factory : IStore. Factory { public IStore<Message> Create.

读懂它的思路 public class Sql. Server. Store. Factory : IStore. Factory { public IStore<Message> Create. Message. Store() => new Sql. Server. Message. Store(); public IStore<Photo> Create. Photo. Store() => new Sql. Server. Photo. Store(); } public class My. SQLStore. Factory : IStore. Factory { public IStore<Message> Create. Message. Store() => new My. SQLMessage. Store(); public IStore<Photo> Create. Photo. Store() => new My. SQLPhoto. Store(); }

读懂它的思路 public class Store. Factory { public static readonly Store. Factory Instance = new

读懂它的思路 public class Store. Factory { public static readonly Store. Factory Instance = new Store. Factory(); public IStore. Factory Create. Store. Factory() { var db. Type = App. Configuration. Get. DBType(); if (string. Equals(db. Type, "mysql", String. Comparison. Ordinal. Ignore. Case)) return new Sql. Server. Store. Factory(); if (string. Equals(db. Type, "mssql", String. Comparison. Ordinal. Ignore. Case)) return new My. SQLStore. Factory(); throw new Configuration. Exception(); } }

读懂它的思路 public class Message. Serivce { private readonly IStore<Message> message. Store; private readonly IStore<Photo>

读懂它的思路 public class Message. Serivce { private readonly IStore<Message> message. Store; private readonly IStore<Photo> photo. Store; public Message. Serivce() { var store. Factory = Store. Factory. Instance. Create. Store. Factory(); message. Store = store. Factory. Create. Message. Store(); photo. Store = store. Factory. Create. Photo. Store(); } //. . . }

读懂它的思路 System. Data. Common. Db. Provider. Factory

读懂它的思路 System. Data. Common. Db. Provider. Factory

读懂它的思路 public static class Service. Locator { private static readonly Concurrent. Dictionary<Type, object> cache

读懂它的思路 public static class Service. Locator { private static readonly Concurrent. Dictionary<Type, object> cache = new Concurrent. Dictionary<Type, object>(); public static void Register<I, T>(T service) where T : class, I => cache. Try. Add(typeof(T), service); public static I Get. Service<I>() => (I)cache. Get. Or. Add(typeof(I), null); }

读懂它的思路 public void Configure() { var db. Type = App. Configuration. Get. DBType(); if

读懂它的思路 public void Configure() { var db. Type = App. Configuration. Get. DBType(); if (string. Equals(db. Type, "mysql", String. Comparison. Ordinal. Ignore. Case)) { Service. Locator. Register<IStore<Message>, My. SQLMessage. Store> (new My. SQLMessage. Store()); Service. Locator. Register<IStore<Photo>, My. SQLPhoto. Store> (new My. SQLPhoto. Store()); } else if (string. Equals(db. Type, "mssql", String. Comparison. Ordinal. Ignore. Case)) { Service. Locator. Register<IStore<Message>, Sql. Server. Message. Store> (new Sql. Server. Message. Store()); Service. Locator. Register<IStore<Photo>, Sql. Server. Photo. Store> (new Sql. Server. Photo. Store()); } }

读懂它的思路 public class Message. Serivce { private readonly IStore<Message> message. Store; private readonly IStore<Photo>

读懂它的思路 public class Message. Serivce { private readonly IStore<Message> message. Store; private readonly IStore<Photo> photo. Store; public Message. Serivce() { message. Store = Service. Locator. Get. Service<IStore<Message>>(); photo. Store = Service. Locator. Get. Service<IStore<Photo>>(); } //. . . }

读懂它的思路 反模式 http: //blog. ploeh. dk/2010/02/03/Service. Locatorisan. Anti-Pattern/

读懂它的思路 反模式 http: //blog. ploeh. dk/2010/02/03/Service. Locatorisan. Anti-Pattern/

了解它的本质 好莱坞原则 Hollywood principle

了解它的本质 好莱坞原则 Hollywood principle

剖析好或不好 收集对象 创建实例 IService. Collection IService. Provider Transient Service. Descriptor 描述依赖关系以及生命周期 Scoped Singleton

剖析好或不好 收集对象 创建实例 IService. Collection IService. Provider Transient Service. Descriptor 描述依赖关系以及生命周期 Scoped Singleton

收集到的一些有意思的链接 • https: //github. com/Microsoft/dotnet/blob/master/dotnet-developer-projects. md • https: //github. com/danielpalme/Ioc. Performance • https: //weblogs.

收集到的一些有意思的链接 • https: //github. com/Microsoft/dotnet/blob/master/dotnet-developer-projects. md • https: //github. com/danielpalme/Ioc. Performance • https: //weblogs. asp. net/jhallal/list-of-net-dependency-injection-containers-ioc • https: //docs. microsoft. com/en-us/azure/architecture/ • https: //docs. microsoft. com/en-us/previous-versions/msp-n-p/dn 178470(v%3 dpandp. 30) • https: //docs. microsoft. com/zh-cn/aspnet/core/fundamentals/dependencyinjection? view=aspnetcore-2. 2