对依赖注入或控制反转不了解的童鞋请先自行学习一下这一设计,这里直接介绍项目和实现步骤。

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

 

目录:

一、介绍

二、纯C#使用Grace的Demo

三、ASP.NET Core使用Grace的Demo

四、ASP.NET MVC使用Grace的Demo

五、多个构造方法

结尾

 

一、介绍

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 }
View Code

相关文章: