对依赖注入或控制反转不了解的童鞋请先自行学习一下这一设计,这里直接介绍项目和实现步骤。
Grace是一个开源、轻巧、易用同时特性丰富、性能优秀的依赖注入容器框架。从这篇IOC容器评测文章找到的Grace,评测显示这款开源轻巧的框架性能挺成熟优秀的,但是中文资料几乎找不到,作者文档也不多,Get Started在各种项目中的案例也没有。这里贴一下介绍和纯后台以及ASP.NET Core的使用Demo,部分翻译自项目,更多内容可以直接看项目的Readme和Tests——Tests作者分类很好,可以作为需求切入点了解。
作者:Ian Johnson
主项目Nuget:https://www.nuget.org/packages/Grace/
主项目Github:https://github.com/ipjohnson/Grace
ASP.Net Core Nuget: https://www.nuget.org/packages/Grace.AspNetCore.MVC
ASP.Net Core Github:https://github.com/ipjohnson/Grace.DependencyInjection.Extensions
目录:
一、介绍
Grace有如下特性:
- 配置提供允许最大限度扩展的流式(Fluent)接口/属性
- 支持子容器和轻量级生命周期作用域
- 支持绑定上下文化(类似NInject)
- 容器创建的IDisposable对象将被跟踪和释放,除非另有配置
- 性能特点使它成为最快的容器之一
- 支持特殊类型
- IEnumerable<T> - 支持将集合解析为IEnumerable<T>,包括其他如List<T>,ReadOnlyCollection<T>,T[]和其他实现ICollection<T>的集合。具体可以查看这里,可以实现批量自动注册绑定。
- Func<T> - 支持自动解析Func<T>
- Lazy<T> - 当解析一个Lazy<T>对象时,其将在自己创建的生命周期内创建和解析对象T
- Owned<T> - 在一个Owned<T>对象内解析时,其将有与自己Owned<T>相关联的生命周期(与Autofac类似)
- Meta<T> - 在一个Meta<T>内解析时,其元数据也会跟着解析
- 自定义委托 - 任何返回一个类型的委托都能被自动解析
- 用Grace.Factory自定义接口
- 支持多种生命周期,包括单例、作用域内单例、请求内单例(MVC4, MVC5 和 WCF 扩展包中)、对象图内单例、基类上单例和弱单例。如果以上都没有符合需求的,可以使用ICompiledLifeStyle接口实现
- 内置支持装饰器设计
- 支持自定义包装(Func<T>和Meta<T>是内置包装的举例)
- ASP.Net Core支持(测试似乎只支持.Net Standard 1.0,DotNetCore 2.0Linux下不行)
- ASP.Net MVC 4 & 5支持
二、纯C#使用Grace的Demo
假设我们有Repository和Service模式,有用户(User)和账户(Account)这两个DAO对象,分别如下定义好接口和类,此部分在附件的“IOCFramework.Dao”工程中。
1 public interface IAccountRepository 2 { 3 string Get(); 4 } 5 6 public class AccountRepository : IAccountRepository 7 { 8 public string Get() 9 { 10 return "[Account]简单注册调用[Repo]"; 11 } 12 } 13 14 public interface IAccountService 15 { 16 string Get(); 17 } 18 19 public class AccountService : IAccountService 20 { 21 IAccountRepository _accountRepository; 22 public AccountService(IAccountRepository accountRepository) 23 { 24 _accountRepository = accountRepository; 25 } 26 27 public string Get() 28 { 29 return _accountRepository.Get() + "[Service]"; 30 } 31 } 32 33 public interface IUserRepository 34 { 35 string Get(); 36 } 37 38 public class UserRepositoryA : IUserRepository 39 { 40 public string Get() 41 { 42 return "[User]键值注册调用A[Repo]"; 43 } 44 } 45 46 public class UserRepositoryB : IUserRepository 47 { 48 public UserRepositoryB(string param1, string param2) 49 { 50 Console.WriteLine($"Ctor param1:{param1}"); 51 } 52 53 public string Get() 54 { 55 return "[User]键值注册调用B[Repo]"; 56 } 57 } 58 59 public interface IUserService 60 { 61 string Get(); 62 } 63 64 public class UserService : IUserService 65 { 66 67 IUserRepository _userRepository; 68 69 public UserService(IUserRepository userRepository) 70 { 71 _userRepository = userRepository; 72 } 73 74 public string Get() 75 { 76 return _userRepository.Get() + "[Service]"; 77 } 78 }